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

Ric*_*ble 5 core-data ios ios-app-group

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

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

Fetches导致此错误:

CoreData:错误:(522)/private/var/mobile/Containers/Shared/AppGroup/[...].sqlite中数据库的I/O错误.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"; NSSQLiteErrorDomain = 19; } CoreData:错误:(19)PRIMARY KEY必须是唯一的

小智 0

这是我通过创建一个框架来保存/管理数据库来做到这一点的

  1. 将相同的条目添加到每个应用程序的应用程序组权利中
  2. 使用它来创建您的数据库URL:

    [NSFileManagerdefaultManager]containerURLForSecurityApplicationGroupIdentifier:

  3. 数据库=[ [UIManagedDocument alloc] initWithFileURL: databaseURL]

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