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

2023-12-07

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

但是,当我调用 persistenceStoreCoordinator.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)")
   }
}

错误是:

无法销毁持久存储:错误域=NSSQLiteErrorDomain 代码=14“(空)”UserInfo={NSFilePath=.../AppName.app/ModelName.momd, Reason=无法截断数据库} - 操作无法 完全的。 (NSSQLiteErrorDomain 错误 14。)

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

以下是调用 destroyPersistentStore 时的情况:

  1. SQLite数据文件确实存在并且包含数据
  2. 发生在模拟器或真实设备上
  3. 型号Url正确,指向模具
  4. 存储类型是 SQLite
  5. SQLite数据文件保存在Documents目录中
  6. persistStoreCoordinator.url(for: permanentStoreCoordinator.persistentStores.first!) 指向 Documents 目录中的文件。

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

最后,当我暂停执行并 po 持久存储协调器.托管对象模型时,第一行是:

po persistenceStoreCoordinator.managedObjectModel () isEditable 0,实体...

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


您正在合并核心数据堆栈中的两个对象:

  • The model位于您的应用程序包内,具有扩展名.momd,并包含有关您的核心数据对象定义的信息:您拥有哪些实体、它们拥有哪些属性、它们的关系等等。
  • The 持久存储是应用程序容器中(而不是捆绑包中)的数据文件。您可以在创建或加载持久性存储时定义其 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)")
   }
}

这会毁掉第一家商店;如果您有多个,您可以循环遍历持久性存储,将它们全部销毁,具体取决于您的应用程序的要求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法销毁使用 Core Data 和 SQLite 创建的持久存储 的相关文章

随机推荐

  • 我可以在 PostgreSQL 中自动从带有标题的 csv 文件创建表吗?

    我在 OS X 10 6 8 上运行 PostgreSQL 9 2 6 我想将带有列标题的 CSV 文件中的数据导入到数据库中 我可以用COPY语句 但前提是我首先手动创建一个表 并为 CSV 文件中的每一列创建一个列 有什么方法可以根据
  • 相当于不依赖innerHTML的html_entity_decode的javascript?

    我正在寻找 PHP 的 javascript 版本html entity decode 我找到了这个 function html entity decode str var tarea document createElement text
  • 启动第二个 JavaFX 应用程序

    我正在尝试从 JavaFx 应用程序中启动 JavaFx 应用程序 但看起来 Application launch 只能调用一次 这是否意味着我必须启动一个单独的 JVM 如 exec java 或者还有其他方法吗 更多背景信息 我希望我的
  • 从函数中的列表中返回项目。蟒蛇[重复]

    这个问题在这里已经有答案了 my list a b c def func input for i in input print i print func my list Output a b c None 我不想要 无 所以如何执行一行代码
  • UIScrollView 不随 UItextfields 一起滚动

    我正在制作一个普通视图 用户可以在其中更新他们的个人资料 我按照以下步骤制作了该视图 创建了一个新的UIViewController带有 xib 文件 Added a UIScrollView在超级视图中 添加了近9个UITextField
  • 使用 .onLoad 加载依赖包

    我的包需要 ggplot2 包 但我无法修复运行 R CMD 检查时得到的以下注释 no visible global function definition for qplot library or require call not de
  • 这个比较器是如何工作的?

    package vehicles order import java util ArrayList import java util Collections import java util Iterator public class ve
  • 理解 let 与 var 提升 [重复]

    这个问题在这里已经有答案了 With let vs var我了解到主要区别在于 let 变量的作用域为最近的块并且不会被提升 也让变量可以重新赋值 但不能在同一作用域内重新声明 那么为什么这段代码会返回 未定义 错误呢 let x 10 i
  • 将 CGImage 转换为 python 图像 (pil/opencv)

    我想在屏幕上进行一些模式识别 并将使用 Quartz PyObjc 库来获取屏幕截图 我得到的屏幕截图是 CGImage 我想使用 openCV 库搜索其中的模式 但似乎找不到如何将数据转换为 opencv 可读的 所以我想做的是 get
  • 如何重新组装 javap 生成的 java 字节码? [复制]

    这个问题在这里已经有答案了 我希望能够编辑字节码并重新编译为可执行类文件 我不知道该怎么做 我尝试使用 javap c 和 v 进行反编译 编辑一些内容 然后将其更改回我的 Class 文件 但出现错误 错误 无法找到或加载主类 Test
  • 如何在 Python 中使用 mutagen 将封面图像添加到 mp3 文件?

    下面的代码似乎没有更新 mp3 文件的插图 代码 from mutagen id3 import ID3 APIC audio ID3 musicFilename with open coverFilename rb as albumart
  • Java 中 == 和 .equals 之间的区别。

    我知道这已经被涵盖了 但我在这里看到了不一致的论点 所以如果我有 String a apple2e String b apple2e System out println a b a b I get FALSE 据我了解 这是因为a and
  • 将工件添加到标准 Maven 部署

    我希望有人可以帮助我进行 Maven 部署 通常通过发布插件运行 我想在发布时将除了打包的 jar 之外的文件部署到存储库 例如特定的说明文档和生成的 SQL 文件 如果我不必使用就好了deploy deploy file为每一个 如果我可
  • 如何控制 PyYAML 对我的数据使用哪种标量形式?

    我有一个具有短字符串属性和长多行字符串属性的对象 我想将短字符串写为 YAML 带引号的标量 将多行字符串写为文字标量 my obj short Hello my obj long Line1 nLine2 nLine3 我希望 YAML
  • 用户身份验证后重定向回页面选项卡?

    在用户验证我的应用程序后 我应该如何将用户重定向回我的页面选项卡 我无法输入一个特定的网址进行重定向 因为我的应用程序将驻留在多个页面上 所以我需要以某种方式获取页面的 id 并将其放入 url 中 我尝试过使用会话变量 但它似乎对我不起作
  • PHP 四舍五入不起作用

    我有这个代码 我想将两位小数四舍五入到一半 我期望值为 0 58 但上面的代码打印 0 57 我怎样才能做到这一点 如果您期望 0 58 则不必使用 半轮 而是使用 ceil 函数 v 0 575 echo ceil v 100 100 s
  • SQLAlchemy 中的编译扩展:索引中使用的函数

    我想在 SQLAlchemy 中创建一个不区分大小写的唯一约束 它可以与 Postgres 和 SQLite 一起使用 在Postgres中是这样实现的 SQL CREATE UNIQUE INDEX my index ON my tabl
  • 删除前面没有 NULL 的换行符

    我有一串数据 在我需要删除的行中插入了随机 CRLF 并以正确的 CRLF 结束了我需要保留的数据 我尝试使用 Notepad 正则表达式尝试将以下内容替换为空 NULL r n 但是 它不会删除插入的 CRLF 关于如何在 Notepad
  • 使用用户输入创建新对象 [JAVA]

    您好 我正在尝试创建一个程序 每当用户输入某个对象的新信息时就创建一个新对象 目前我有这个 import java util Scanner public class Main public static void main String
  • 无法销毁使用 Core Data 和 SQLite 创建的持久存储

    我有一个 iOS 应用程序 我想在每次启动时都从一个新的核心数据数据库开始 存储类型是 SQLite 但是 当我调用 persistenceStoreCoordinator destroyPersistentStore 时 100 都会收到