6

我制作了一个 iOS 8 应用程序,它使用新的应用程序组功能与扩展程序共享核心数据存储。它工作得非常好,以至于我想我会尝试使用 2 个独立的应用程序来共享一个应用程序组容器中的核心数据存储。但是,虽然它在 App 和 Extension 之间工作,但在与 2 个应用程序共享时,我遇到了 Core Data 存储损坏问题。

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

提取导致此错误:

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

保存导致此错误:

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

或者:

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

4

1 回答 1

0

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

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

    [NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:

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

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