引用在 AppDelegate 中创建的 NSPersistentStore 实例
Referring to NSPersistentStore instances created in AppDelegate
我修改了通过核心数据应用程序获得的样板核心数据堆栈代码,将两个 NSPersistentStore
添加到 NSPersistentStoreCoordinator
而不是一个。
// MARK: - Core Data stack
lazy var applicationDocumentsDirectory: NSURL = {
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
return urls[urls.count-1] as NSURL
}()
lazy var managedObjectModel: NSManagedObjectModel = {
let modelURL = NSBundle.mainBundle().URLForResource("DB", withExtension: "momd")!
return NSManagedObjectModel(contentsOfURL: modelURL)!
}()
lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = {
var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
var error: NSError? = nil
let firstStoreURL = self.applicationDocumentsDirectory.URLByAppendingPathComponent("first-store.sqlite")
if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: firstStoreURL, options: nil, error: &error) == nil {
coordinator = nil
NSLog("Unresolved error \(error), \(error!.userInfo)")
abort()
}
let secondStoreURL = self.applicationDocumentsDirectory.URLByAppendingPathComponent("second-store.sqlite")
if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: secondStoreURL, options: nil, error: &error) == nil {
coordinator = nil
NSLog("Unresolved error \(error), \(error!.userInfo)")
abort()
}
return coordinator
}()
lazy var managedObjectContext: NSManagedObjectContext? = {
let coordinator = self.persistentStoreCoordinator
if coordinator == nil {
return nil
}
var managedObjectContext = NSManagedObjectContext()
managedObjectContext.persistentStoreCoordinator = coordinator
return managedObjectContext
}()
// MARK: - Core Data Saving support
func saveContext() {
if let moc = self.managedObjectContext {
var error: NSError? = nil
if moc.hasChanges && !moc.save(&error) {
NSLog("Unresolved error \(error), \(error!.userInfo)")
abort()
}
}
}
添加 NSManagedObject
对象时需要指定商店,如下所示。
let someObject = NSManagedObject(entity: "someEntity", insertIntoManagedObjectContext: context)
context.assignObject(someObject, toPersistentStore: <store instance>)
并指定我需要从中获取数据的商店。
let entityDescription = NSEntityDescription.entityForName("someEntity", inManagedObjectContext: context)
let fetchRequest = NSFetchRequest()
fetchRequest.entity = entityDescription
fetchRequest.affectedStores = [<store instance>]
我的问题是如何获得对在 AppDelegate 中创建的那些 NSPersistentStore
的引用?
明确一点,我已经知道如何获取对 AppDelegate 本身的引用。
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
我卡住了 NSPersistentStore
部分。
我试过像这样在 AppDelegat 中将它创建为单独的 属性,但我不知道如何从 persistentStoreCoordinator
.
调用 it/add 它
var firstStore: NSPersistentStore {
var store: NSPersistentStore!
if let coordinator = persistentStoreCoordinator {
let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("first-store.sqlite")
var error: NSError?
store = coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil, error: &error)!
}
return store
}
此外,每当我调用此 属性 时,它不会向协调器添加一个新的商店实例吗?
要在应用委托中获取 属性 的引用,您需要先获取应用委托引用:
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
然后您可以从您的 appDelegate 对象
中获取并使用任何 属性
let someObject = NSManagedObject(entity: "someEntity",insertIntoManagedObjectContext: context)
context.assignObject(someObject, toPersistentStore: appDelegate.persistentStoreCoordinator)
NSPersistentStoreCoordinator
上有一个 persistentStores
property 可以用于此目的。它 returns 一个(大概)NSPersistentStore
个实例的数组。
// Get the first store, assuming it exists
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let firstStore = appDelegate.persistentStoreCoordinator.persistentStores[0] as NSPersistentStore
我修改了通过核心数据应用程序获得的样板核心数据堆栈代码,将两个 NSPersistentStore
添加到 NSPersistentStoreCoordinator
而不是一个。
// MARK: - Core Data stack
lazy var applicationDocumentsDirectory: NSURL = {
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
return urls[urls.count-1] as NSURL
}()
lazy var managedObjectModel: NSManagedObjectModel = {
let modelURL = NSBundle.mainBundle().URLForResource("DB", withExtension: "momd")!
return NSManagedObjectModel(contentsOfURL: modelURL)!
}()
lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = {
var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
var error: NSError? = nil
let firstStoreURL = self.applicationDocumentsDirectory.URLByAppendingPathComponent("first-store.sqlite")
if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: firstStoreURL, options: nil, error: &error) == nil {
coordinator = nil
NSLog("Unresolved error \(error), \(error!.userInfo)")
abort()
}
let secondStoreURL = self.applicationDocumentsDirectory.URLByAppendingPathComponent("second-store.sqlite")
if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: secondStoreURL, options: nil, error: &error) == nil {
coordinator = nil
NSLog("Unresolved error \(error), \(error!.userInfo)")
abort()
}
return coordinator
}()
lazy var managedObjectContext: NSManagedObjectContext? = {
let coordinator = self.persistentStoreCoordinator
if coordinator == nil {
return nil
}
var managedObjectContext = NSManagedObjectContext()
managedObjectContext.persistentStoreCoordinator = coordinator
return managedObjectContext
}()
// MARK: - Core Data Saving support
func saveContext() {
if let moc = self.managedObjectContext {
var error: NSError? = nil
if moc.hasChanges && !moc.save(&error) {
NSLog("Unresolved error \(error), \(error!.userInfo)")
abort()
}
}
}
添加 NSManagedObject
对象时需要指定商店,如下所示。
let someObject = NSManagedObject(entity: "someEntity", insertIntoManagedObjectContext: context)
context.assignObject(someObject, toPersistentStore: <store instance>)
并指定我需要从中获取数据的商店。
let entityDescription = NSEntityDescription.entityForName("someEntity", inManagedObjectContext: context)
let fetchRequest = NSFetchRequest()
fetchRequest.entity = entityDescription
fetchRequest.affectedStores = [<store instance>]
我的问题是如何获得对在 AppDelegate 中创建的那些 NSPersistentStore
的引用?
明确一点,我已经知道如何获取对 AppDelegate 本身的引用。
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
我卡住了 NSPersistentStore
部分。
我试过像这样在 AppDelegat 中将它创建为单独的 属性,但我不知道如何从 persistentStoreCoordinator
.
var firstStore: NSPersistentStore {
var store: NSPersistentStore!
if let coordinator = persistentStoreCoordinator {
let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("first-store.sqlite")
var error: NSError?
store = coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil, error: &error)!
}
return store
}
此外,每当我调用此 属性 时,它不会向协调器添加一个新的商店实例吗?
要在应用委托中获取 属性 的引用,您需要先获取应用委托引用:
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
然后您可以从您的 appDelegate 对象
中获取并使用任何 属性let someObject = NSManagedObject(entity: "someEntity",insertIntoManagedObjectContext: context)
context.assignObject(someObject, toPersistentStore: appDelegate.persistentStoreCoordinator)
NSPersistentStoreCoordinator
上有一个 persistentStores
property 可以用于此目的。它 returns 一个(大概)NSPersistentStore
个实例的数组。
// Get the first store, assuming it exists
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let firstStore = appDelegate.persistentStoreCoordinator.persistentStores[0] as NSPersistentStore