引用在 AppDelegate 中创建的 NSPersistentStore 实例
Posted
技术标签:
【中文标题】引用在 AppDelegate 中创建的 NSPersistentStore 实例【英文标题】:Referring to NSPersistentStore instances created in AppDelegate 【发布时间】:2015-03-16 10:09:21 【问题描述】:我修改了您使用核心数据应用程序获得的样板核心数据堆栈代码,将两个NSPersistentStore
s 添加到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
s 的引用?
为了清楚起见,我已经知道如何获取对 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
除了每当我调用这个属性时,它不会向协调器添加一个新的商店实例吗?
【问题讨论】:
@LordZsolt 嗨,我用类似的尝试更新了我的问题,但我也有点卡住了。 是的,这会将 store 的新实例添加到协调器中。但是你可以通过[persistentStoreCoordinator.persistentStores count]
来限制商店的数量
虽然我不明白你为什么想要两个持久存储。也许两个协调员...
这不是只返回该协调器中持久存储的数量吗?它只是一个只读属性。
嗯,是的,如果计数大于 2,则表示您已经有 2 个并且您没有添加新的。虽然我还是不明白你在做什么......
【参考方案1】:
NSPersistentStoreCoordinator
上有一个persistentStores
property,您可以用于此目的。它返回一个(大概)NSPersistentStore
实例的数组。
// Get the first store, assuming it exists
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let firstStore = appDelegate.persistentStoreCoordinator.persistentStores[0] as NSPersistentStore
【讨论】:
【参考方案2】:要获取应用委托中的属性引用,您需要先获取应用委托引用:
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
然后您就可以从您的 appDelegate 对象中获取和使用任何属性
let someObject = NSManagedObject(entity: "someEntity",insertIntoManagedObjectContext: context)
context.assignObject(someObject, toPersistentStore: appDelegate.persistentStoreCoordinator)
【讨论】:
您好,感谢您的回复。是的,我知道如何获取 AppDelegate 的参考。我只是不确定如何将NSPersistentStore
分隔为属性。我尝试更新了我的问题。
NSPersistentStore
作为属性到底是什么意思? .我认为appDelegate. persistentStoreCoordinator
会为你做到这一点以上是关于引用在 AppDelegate 中创建的 NSPersistentStore 实例的主要内容,如果未能解决你的问题,请参考以下文章
AppDelegate (OSX) 中主 NSWindow 的引用出口
在 Terraform 中,如何在包含的模块中引用根模块中创建的组件