- NSPersistentContainer – en konstig klass med alla funktioner för att arbeta med kärndata som kallas Core Data stack.
- NSManagedObjectContext-utrymme för att generera, lagra och hämta data.Utför operationer från det här objektet. Det finns en egenskap som heter viewContext inuti nspersisitentcontainer, så du behöver inte göra det själv.
- NSFetchRequest-objektet du behöver skapa för att få data.
- NSEntityDescription-Entity UkrainianEntityubbi.*.Enheten i filen xcdatamodeld.
- DataController-en anpassad klass för att hantera ovanstående together.It kommer att förklaras nedan.
(för referens) klasser som måste beröras före iOS 10
- NSPersistentStoreCoordinator – en person som har en Lagring (kallad Persistent store) för att lagra data och det hanterade Objektkontexten som nämns ovan.
policy
Jag tror att det skulle vara lättare att hantera om du skapar en klass som heter
DataController och gör allt komplett i det.
om du markerar ”Använd kärndata” när du skapar ett nytt projekt, AppDelegate.I swift läggs Kärndatarelaterad kod till, men den måste komma åt AppDelegate en efter en, och det är förvirrande blandat med den ursprungliga koden för AppDelegate, så det är skrivet i dokumentet att det är bättre att sätta ihop det i en klass (se här)
initialisering
datacontroller class initialization
datacontroller class initialization
datacontroller class initialization
datacontroller class initialization
datacontroller class initialization
datacontroller class initialization
datacontroller class initialization
datacontroller class initialization
datacontroller class initialization nitialiseringen ser ut så här: "DataModel"
är olika för varje projekt, så ändra det i enlighet därmed.Specifikt förlängningen .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() } } // 以下もっと追加していくよー}
detta är tidpunkten för att generera DataController, men jag kommer att försöka i början av AppDelegate för nu.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: ?) -> Bool { dataController = DataController() { // なんかしたいことあれば } //... return true}
skapa och spara hanterat objekt
func createEmployee() -> EmployeeMO { let context = persistentContainer.viewContext let employee = NSEntityDescription.insertNewObject(forEntityName: "Employee", into: context) as! EmployeeMO return employee}
subclassing NSManagedObject
underklasser tillåter direkt åtkomst till Egenskaper (attribut).
i Xcode 9 skapas det automatiskt när du lägger till enhet, så du kanske inte behöver skriva det själv om du inte gör speciell behandling.
class EmployeeMO: NSManagedObject { @NSManaged var name: String?}
spara nsmanagedobject instans
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)") } }}
ladda nsmanagedobject-instans
skapa nsfetchrequest-objekt och ställ in sammanhang.Ring bara hämta ().
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 }
filtrera resultatet
let employeesFetch = ...
Lägg till det efter detta för att få det filtrerade resultatet.
let firstName = "Trevor"employeesFetch.predicate = NSPredicate(format: "firstName == %@", firstName)
förutom att begränsa resultatet kan du också ange att returnera en ordbok istället för NSManagedObject.Du kan också ange att ordlistan endast innehåller vissa egenskaper hos enheten.
skapa och ändra anpassade hanterade objekt
i Xcode 8, iOS 10 och senare, när du skapar en Kärndatamodell i Xcode, genereras en underklass eller förlängning av NSManagedObject automatiskt.Dessa filer ingår inte i projektet och skapas vid byggtiden (se här).