gpt4 book ai didi

ios - 无法销毁使用 Core Data 和 SQLite 创建的持久存储

转载 作者:行者123 更新时间:2023-11-28 10:07:09 25 4
gpt4 key购买 nike

我有一个 iOS 应用程序,我想在每次启动时从一个新的核心数据数据库开始。存储类型是 SQLite。

但是,当我调用 persistentStoreCoordinator.destroyPersistentStore() 时,100% 的时间我都会收到错误。

代码如下:

func destroyPersistentStore() {
guard let modelURL = Bundle.main.url(forResource: self.modelName, withExtension: "momd") else {
print("Missing data model - could not destroy")
return
}

do {
try persistentStoreCoordinator.destroyPersistentStore(at: modelURL, ofType: storeType, options: nil)
} catch {
print("Unable to destroy persistent store: \(error) - \(error.localizedDescription)")
}
}

错误是:

Unable to destroy persistent store: Error Domain=NSSQLiteErrorDomain Code=14 "(null)" UserInfo={NSFilePath=.../AppName.app/ModelName.momd, reason=Failed to truncate database} - The operation couldn’t be completed. (NSSQLiteErrorDomain error 14.)

即使出现此错误,该应用程序仍能够保存和访问商店中的数据。问题在于每次启动时都会加载初始数据,从而产生重复数据。

这是调用 destroyPersistentStore 时的情况:

  1. SQLite数据文件肯定存在并且包含数据
  2. 发生在模拟器或真实设备上
  3. modelUrl 正确,指向momd
  4. 存储类型是 SQLite
  5. SQLite数据文件保存在Documents目录下
  6. persistentStoreCoordinator.url(对于:persistentStoreCoordinator.persistentStores.first!)指向 Documents 目录中的文件。

我在网上搜索了答案,找不到任何人报告这个错误,但我在这个项目和一个简化的演示项目中都有错误。我根本无法使 destroyPersistentStore 工作。

最后,当我暂停执行并 po persistentStoreCoordinator.managedObjectModel 时,第一行是:

po persistentStoreCoordinator.managedObjectModel () isEditable 0, entities...

isEditable 问题可能是问题所在吗?我该如何改变它?

最佳答案

你在 Core Data 堆栈中合并了两个对象:

  • 模型 位于您的应用程序包内,扩展名为 .momd,并包含有关您的 Core Data 对象定义的信息:您拥有哪些实体,它们拥有哪些属性,他们的关系,等等。
  • 持久性存储 是您应用容器中的一个数据文件(不在包中)。您在创建或加载持久存储时定义其 URL。它包含模型对象实际实例的数据,而不是抽象定义。

我认为您想要的不是获取模型的 URL,而是想要获取持久性存储的 URL。您可以通过查看持久存储协调器的 persistentStores 数组、选择一个并获取其 URL 来做到这一点:

func destroyPersistentStore() {
guard let firstStoreURL = persistentStoreCoordinator.persistentStores.first?.url else {
print("Missing first store URL - could not destroy")
return
}

do {
try persistentStoreCoordinator.destroyPersistentStore(at: firstStoreURL, ofType: storeType, options: nil)
} catch {
print("Unable to destroy persistent store: \(error) - \(error.localizedDescription)")
}
}

这会破坏第一个商店;如果您有多个,则可以根据您应用的要求遍历持久性存储并销毁它们。

关于ios - 无法销毁使用 Core Data 和 SQLite 创建的持久存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51995296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com