从两个应用程序访问共享数据

Accessing Shared Data from Two Apps

你知道如何与两个应用程序(你的所有者)共享核心数据,允许读取和写入同一个 .sqlite 吗?

我尝试过使用应用程序组:

1) Bank.xcdatamodeld BankInfo.swift BankDetails.swift

我已将这些文件复制到此应用程序 B 的项目目录中(从应用程序 A 的项目中检索),然后将它们拖入 Xcode。

2) 我已经从应用程序组的公共沙箱中检索到 sqlite 文件

应用委托:核心数据堆栈[Swift]

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("shareapps", withExtension: "momd")!
    return NSManagedObjectModel(contentsOfURL: modelURL)!
    }()

lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = {


    // Create the coordinator and store

    var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)

    let directory = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("com.sd.shareapps");

    let url = directory?.URLByAppendingPathComponent("shareapps.sqlite")

    //Sarting frehs every time
    NSFileManager.defaultManager().removeItemAtURL(url!, error: nil)

    var error: NSError? = nil
    var failureReason = "There was an error creating or loading the application's saved data."

    if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil, error: &error) == nil {
        coordinator = nil
        // Report any error we got.
        let dict = NSMutableDictionary()
        dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data"
        dict[NSLocalizedFailureReasonErrorKey] = failureReason
        dict[NSUnderlyingErrorKey] = error
        error = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
        // Replace this with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
        NSLog("Unresolved error \(error), \(error!.userInfo)")
        abort()
    }
    println("\(coordinator?.persistentStores)")
    return coordinator
    }()     
lazy var managedObjectContext: NSManagedObjectContext? = {

    let coordinator = self.persistentStoreCoordinator
    if coordinator == nil {
        return nil
    }
    var managedObjectContext = NSManagedObjectContext()
    managedObjectContext.persistentStoreCoordinator = coordinator
    return managedObjectContext
}()

我收到此错误消息:

"*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSPersistentStoreCoordinator for searching for entity name 'Entity'"

此致

错误信息

"*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSPersistentStoreCoordinator for searching for entity name 'Entity'"

给出了回答这个问题的关键。错误消息在措辞上与 is not a legal NSManagedObjectContext... 非常相似,在类似的问题 +entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'Account''.

中得到了回答

因此,尽管在这两种情况下错误消息都是隐含的,但在这种情况下,错误消息意味着您在代码中的某处为 NSPersistentStoreCoordinator 传递了 nil。设置断点应该有助于确定断点在哪里。通过对您的代码进行以下修改,我能够重现相同的错误:

lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = {  
    // normally we would initialize the persistentStoreCoordinator here
    // but to reproduce an error, just return nil
    return nil;
} 

    lazy var managedObjectContext: NSManagedObjectContext? = {

    let coordinator = self.persistentStoreCoordinator
          // normally, we would return nil right away if there is 
          // no coordinator, but to reproduce the error carry on anyway
//        if coordinator == nil {
//            return nil
//        }
    var managedObjectContext = NSManagedObjectContext()
    managedObjectContext.persistentStoreCoordinator = coordinator
    return managedObjectContext
}()

对于阅读此答案的任何其他人,请注意,除非我们对 Core Data 做一些有用的事情,否则将永远不会使用 Core Data 堆栈(不会初始化惰性变量)。在我为重现此错误消息而创建的示例应用程序中,我只是将 Core Data 堆栈留在原地(Xcode 模板将其放在 App Delegate 中),然后我尝试在 didFinishLaunchingWithOptions 中创建一个实体:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.

        var context : NSManagedObjectContext? = self.managedObjectContext

        // the line below will cause an exception when the
        // NSPersistentStoreCoordinator is nil
        var entity : NSEntityDescription? = NSEntityDescription.entityForName("Entity", 
           inManagedObjectContext:context!)

        return true
    } 

请注意,原文中提供的代码post并没有导致任何错误。可能 posted 问题中的代码与项目中使用的实际代码不匹配,或者可能在应用程序的其他地方存在使用 nil 持久存储协调器创建的托管对象上下文。无论如何,神秘的错误信息已被破译。

您可能希望确保已正确设置共享应用组。请参阅这篇文章 (http://jasoncross-ios-development.blogspot.com/2015/04/accessing-shared-data-between-ios.html),其中介绍了使用权利设置共享应用程序组。