引用在 AppDelegate 中创建的 NSPersistentStore 实例 [英] Referring to NSPersistentStore instances created in AppDelegate

查看:24
本文介绍了引用在 AppDelegate 中创建的 NSPersistentStore 实例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我修改了您通过核心数据应用程序获得的样板核心数据堆栈代码,将两个 NSPersistentStore 添加到 NSPersistentStoreCoordinator 而不是一个.

I modified the boilerplate core data stack code you get with a core data application to add two NSPersistentStores to the NSPersistentStoreCoordinator instead of just one.

// 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 对象时指定存储,如下所示.

I need to specify the store when adding NSManagedObject objects like below.

let someObject = NSManagedObject(entity: "someEntity", insertIntoManagedObjectContext: context)
context.assignObject(someObject, toPersistentStore: <store instance>)

并指定我需要从中获取数据的商店.

And specifying the stores which I need to fetch data from like this.

let entityDescription = NSEntityDescription.entityForName("someEntity", inManagedObjectContext: context)

let fetchRequest = NSFetchRequest()
fetchRequest.entity = entityDescription
fetchRequest.affectedStores = [<store instance>]

我的问题是如何获得对在 AppDelegate 中创建的那些 NSPersistentStore 的引用?

My question is how can I get a reference to those NSPersistentStores created in the AppDelegate?

为了清楚起见,我已经知道如何获得对 AppDelegate 本身的引用.

Just to be clear, I already know how to get a reference to the AppDelegate itself.

let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate

获取 NSPersistentStore 部分是我卡住的地方.

It's the getting the NSPersistentStore part is where I'm stuck.

我尝试像这样在 AppDelegat 中将它创建为一个单独的属性,但我不知道如何从 persistentStoreCoordinator 调用它/添加它.

I tried creating it as a separate property in the AppDelegat like this but I don't know how to call it/add it from 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
}

除了每当我调用这个属性时,它不会向协调器添加一个商店的新实例吗?

Besides whenever I call this property, wouldn't it add a new instance of a store to the coordinator?

推荐答案

有一个 persistentStores propertyNSPersistentStoreCoordinator 上,您可以为此使用目的.它返回一个(大概)NSPersistentStore 实例的数组.

There is a persistentStores property on NSPersistentStoreCoordinator you can use for this purpose. It returns an array of (presumably) NSPersistentStore instances.

// Get the first store, assuming it exists
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let firstStore = appDelegate.persistentStoreCoordinator.persistentStores[0] as NSPersistentStore

这篇关于引用在 AppDelegate 中创建的 NSPersistentStore 实例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆