如何使用应用程序组与多个应用程序(不仅仅是扩展程序)共享核心数据,并避免损坏的核心数据存储?

时间:2015-02-18 18:45:54

标签: ios core-data ios-app-group

我创建了一个iOS 8应用程序,它使用新的应用程序组功能与扩展程序共享Core Data存储。它工作得很好,以为我会尝试使用2个独立的应用程序在App Group容器中共享Core Data存储。 但是,虽然它在App和Extension之间起作用,但在与2个应用共享时,我收到Core Data存储损坏问题。

根据我打开2个应用的顺序,我会遇到不同的错误:

Fetches导致此错误:

  

CoreData:错误:(522)数据库的I / O错误   /private/var/mobile/Containers/Shared/AppGroup/[...].sqlite。 SQLite的   错误代码:522,'不是错误'

保存导致此错误:

  

CoreData:错误:(11)致命错误。数据库在   /private/var/mobile/Containers/Shared/AppGroup/[...].sqlite是   损坏。 SQLite错误代码:11,'数据库磁盘映像格式错误'

或者:

  

核心数据:错误:-executeRequest:遇到异常=错误   在SQL执行期间:PRIMARY KEY必须是唯一的userInfo = {       NSFilePath =" / private / var / mobile / Containers / Shared / AppGroup / [...]。sqlite&#34 ;;       NSSQLiteErrorDomain = 19; } CoreData:错误:(19)PRIMARY KEY必须是唯一的

1 个答案:

答案 0 :(得分:0)

这是我如何通过创建一个框架来保存/管理数据库

  1. 将相同条目添加到每个应用中的应用组权利
  2. 使用它来创建databaseURL:

    [NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:

  3. database = [ [UIManagedDocument alloc] initWithFileURL: databaseURL]

  4. [database saveToFileURL: database.fileURL forSaveOperation: UIDocumentSaveForCreating completionHandler: ^(BOOL success)
  5. 如果成功,请初始化persistentContainer
  6. 现在这里是棘手的部分...... managedObjectModel必须由框架定义。它不能在任何应用程序中。他们可以看到它,但它必须是框架的一部分。 这是基本大纲,还有更多内容,但有了这个,你应该能够到达那里。玩得开心!