引用在 AppDelegate 中创建的 NSPersistentStore 实例

Posted

技术标签:

【中文标题】引用在 AppDelegate 中创建的 NSPersistentStore 实例【英文标题】:Referring to NSPersistentStore instances created in AppDelegate 【发布时间】:2015-03-16 10:09:21 【问题描述】:

我修改了您使用核心数据应用程序获得的样板核心数据堆栈代码,将两个NSPersistentStores 添加到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 中创建的 NSPersistentStores 的引用?

为了清楚起见,我已经知道如何获取对 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 中,如何在包含的模块中引用根模块中创建的组件

从另一个类模块引用在 main 中创建的类的实例

如何在 ARM 模板中引用在 Azure 门户中创建的现有存储账户?

当我引用其他表时,如何保存在 Access 2003 中的表单中创建的数据?