首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >引用在NSPersistentStore中创建的AppDelegate实例

引用在NSPersistentStore中创建的AppDelegate实例
EN

Stack Overflow用户
提问于 2015-03-16 10:09:21
回答 2查看 817关注 0票数 0

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

代码语言:javascript
复制
// 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对象时指定存储区,如下所示。

代码语言:javascript
复制
let someObject = NSManagedObject(entity: "someEntity", insertIntoManagedObjectContext: context)
context.assignObject(someObject, toPersistentStore: <store instance>)

并指定我需要从这里获取数据的商店。

代码语言:javascript
复制
let entityDescription = NSEntityDescription.entityForName("someEntity", inManagedObjectContext: context)

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

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

为了明确起见,我已经知道如何获得对AppDelegate本身的引用。

代码语言:javascript
复制
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate

这是得到的NSPersistentStore部分是我被困的地方。

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

代码语言:javascript
复制
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
}

此外,每当我调用该属性时,它是否会向协调器添加一个新的存储实例?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-16 11:46:29

有一个persistentStores 属性 on NSPersistentStoreCoordinator可用于此目的。它返回(想必) NSPersistentStore实例的数组。

代码语言:javascript
复制
// Get the first store, assuming it exists
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let firstStore = appDelegate.persistentStoreCoordinator.persistentStores[0] as NSPersistentStore
票数 1
EN

Stack Overflow用户

发布于 2015-03-16 10:35:38

要获得app委托中的属性引用,首先需要获得app委托引用,方法如下:

代码语言:javascript
复制
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate

然后您可以从您的appDelegate对象获取和使用任何属性。

代码语言:javascript
复制
let someObject = NSManagedObject(entity: "someEntity",insertIntoManagedObjectContext: context)
context.assignObject(someObject, toPersistentStore: appDelegate.persistentStoreCoordinator)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29074157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档