2015-04-03 83 views
1

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

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

1) Bank.xcdatamodeld BankInfo.swift BankDetails.swift

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

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

应用代表:核心数据堆叠[夫特]

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'" 

Regards

+0

当您创建托管对象上下文时,是否为其分配了有效的持久性存储协调器? (这是什么样的代码?) – 2015-04-03 13:15:03

+0

'''lazy var managedObjectContext:NSManagedObjectContext? = { 让协调员=自我。persistentStoreCoordinator 如果协调== {零回报 零 } VAR managedObjectContext =的NSManagedObjectContext() managedObjectContext.persistentStoreCoordinator =协调员 回报managedObjectContext }()'''应用崩溃不传球给我的核心数据堆栈断点。我不确定要继续这个好方法。 – Hobbes 2015-04-03 13:37:07

回答

0

错误消息

"*** 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''中得到了回答。

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

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有用。在示例应用程序,我创建重现此错误消息,我刚刚离开的核心数据堆栈到位(Xcode的模板,把它在App代表),然后我试图创建内部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 
    } 

请注意,原始帖子中提供的代码不会导致任何错误。可能发布的问题中的代码与项目中使用的实际代码不匹配,或者可能在应用程序中的其他位置存在使用零持久存储协调器创建的托管对象上下文。无论如何,这个神秘的错误信息已被破译。

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

+0

谢谢你的帮助:) – Hobbes 2015-04-09 16:09:49

+0

非常欢迎。 – 2015-04-09 18:43:54

相关问题