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

霍布斯

您知道如何与两个拥有相同.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不是搜索实体名称'Account'的合法NSManagedObjectContext参数

因此,尽管该错误信息是在两种情况下隐藏的,在这种情况下,错误消息意味着你逝去的地方在你的代码nilNSPersistentStoreCoordinator设置断点应有助于确定位置。通过对您的代码进行以下修改,我能够重现相同的错误:

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
    } 

请注意,原始帖子中提供的代码没有引起任何错误。可能是发布的问题中的代码与项目中使用的实际代码不匹配,或者可能是应用程序中的其他地方,存在一个使用nil持久存储协调器创建的托管对象上下文。无论如何,已解密的错误消息。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

iOS / Swift-使用应用程序组访问共享数据库

授予从应用程序访问共享邮箱的权限

两个进程无锁访问共享内存

android中两个应用程序之间的数据共享

如何在两个应用程序之间共享数据

当应用程序集群时在两个 JVM 之间共享数据

在两个或多个iPhone应用程序之间共享数据

共享同一数据库Rails的两个应用程序

如何使用属性在 MATLAB App Designer 中的两个应用程序之间共享数据?

使用SharedPreferences在两个单独的Android应用程序之间共享数据

两个共享数据和会话的Web应用程序

在两个应用程序之间共享界面?

在两个Laravel应用程序之间共享事件

在两个MVC应用程序之间共享缓存

在两个节点应用程序之间共享会话

如何从两个Openshift应用程序访问MongoDB数据库?

通过2个应用程序同时共享两个文本文件中的数据

两个Codenameone应用程序可以共享一个SQLite数据库吗?

如何创建和访问共享应用程序组文档目录?

我的应用程序尝试从非活动类访问共享首选项时被终止

迁移和两个应用程序共享不同计算机上的部分数据库

Internet连接可用时,通过API在两个ASP.NET MVC 5应用程序之间共享数据

如何在一个 Angular 应用程序中访问两个 Mongo 数据库?

如何防止两个应用程序同时访问一个数据库

在使用 Inno Setup 安装的两个应用程序之间共享注册的 .NET 程序集

在两个不同的Web应用程序中共享一个会话

如何在两个 asp.net 应用程序之间共享身份验证

Android中两个不同应用程序之间的共享元素转换?

在两个Rails应用程序之间共享通用模型