- Contenedor permanente: Una clase extraña con todas las funciones para trabajar con Datos centrales llamada Pila de datos centrales.
- NSManagedObjectContext – espacio para generar, almacenar y recuperar datos.Realice operaciones desde este objeto. Hay una propiedad llamada ViewContext dentro de nspersisitentcontainer, por lo que no tiene que hacerla usted mismo.
- NSFetchRequest – El objeto que necesita crear para obtener los datos.
- NSEntityDescription – Entityの詳細を表すクラス。entity、、*.La Entidad en el archivo xcdatamodeld.
- Controlador de datos – Una clase personalizada para manejar lo anterior together.It se explicará a continuación.
(para referencia) Clases que deben tocarse antes de iOS 10
- NSPersistentStoreCoordinator: una persona que tiene un almacenamiento (llamado Almacén persistente) para almacenar datos y el Contexto de Objeto administrado mencionado anteriormente.
política
Creo que sería más fácil de manejar si crea una clase llamada
DataController y la completa en ella.
Si marca «Usar datos centrales» al crear un nuevo proyecto, AppDelegate.En swift, se agrega código relacionado con el núcleo de datos, pero tiene que acceder a AppDelegate uno por uno, y es confuso mezclado con el código original de AppDelegate, por lo que está escrito en el documento que es mejor juntarlo en una clase (consulte aquí)
inicialización
Inicialización de clase de controlador de datos
Inicialización de clase de controlador de datos
Inicialización de clase de controlador de datos
Inicialización de clase de controlador de datos
Inicialización de clase de controlador de datos
Inicialización de clase de controlador de datos
Inicialización de clase de controlador de datosa inicialización se ve así: "DataModel"
es diferente para cada proyecto, así que cámbielo en consecuencia.En concreto, la extensión .xcdatamodeld
.
import UIKitimport CoreDataclass DataController: NSObject { var persistentContainer: NSPersistentContainer! init(completionClosure: @escaping () -> ()) { persistentContainer = NSPersistentContainer(name: "DataModel") persistentContainer.loadPersistentStores() { (description, error) in if let error = error { fatalError("Failed to load Core Data stack: \(error)") } completionClosure() } } // 以下もっと追加していくよー}
Este es el momento para generar el controlador de datos, pero lo intentaré al principio de AppDelegate por ahora.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: ?) -> Bool { dataController = DataController() { // なんかしたいことあれば } //... return true}
Crear y guardar objetos Administrados
func createEmployee() -> EmployeeMO { let context = persistentContainer.viewContext let employee = NSEntityDescription.insertNewObject(forEntityName: "Employee", into: context) as! EmployeeMO return employee}
crear subclases de NSManagedObject
Subclases permiten el acceso directo a las propiedades (atributos).
En Xcode 9, se crea automáticamente cuando agrega Entidad, por lo que es posible que no tenga que escribirla usted mismo a menos que realice un procesamiento especial.
class EmployeeMO: NSManagedObject { @NSManaged var name: String?}
Guardar NSManagedObject ejemplo
func saveContext() { let context = persistentContainer.viewContext if context.hasChanges { do { try context.save() } catch { // Replace this implementation with code to handle the error appropriately. // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. let nserror = error as NSError fatalError("Unresolved error \(nserror), \(nserror.userInfo)") } }}
cargar instancia NSManagedObject
Crear objeto NSFetchRequest y establecer contexto.Solo tienes que llamar a fetch ().
func fetchEmployees() -> { let context = persistentContainer.viewContext let employeesFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Employee") do { let fetchedEmployees = try context.fetch(employeesFetch) as! return fetchedEmployees } catch { fatalError("Failed to fetch employees: \(error)") } return }
filtrado el resultado
let employeesFetch = ...
Agregar que después de esto para obtener el filtrado de resultados.
let firstName = "Trevor"employeesFetch.predicate = NSPredicate(format: "firstName == %@", firstName)
además de reducir por el resultado, también puede especificar para devolver un Diccionario en lugar de NSManagedObject.También puede especificar que el Diccionario contenga solo ciertas propiedades de la Entidad.
Creación y modificación de objetos administrados personalizados
En Xcode 8, iOS 10 y versiones posteriores, al crear un modelo de datos básicos en Xcode, se genera automáticamente una subclase o extensión de NSManagedObject.Estos archivos no están incluidos en el proyecto y se crean en el momento de la compilación (ver aquí).