【问题标题】:Save large amount of Data into CoreData将大量数据保存到 CoreData
【发布时间】:2019-10-29 19:43:53
【问题描述】:

我想保存大量数据到CoreData,我的数据资源在CSV 格式。

我知道以下实现方法。

  1. Multiple MOC 的帮助下 - 我已经尝试过这个,但它只能帮助我不要在 主线程 上冻结我的应用程序,实际上在启动后我想要在后台线程中保存数据时也使用该数据 - 可能不会立即在所需屏幕上获得该数据(实际上,即使我面对它,我也无法获取我想要的实体 - 也许还剩下要保存在 CoreData 堆栈上吗?
  2. 我需要将该文件转换为 plist 扩展名 文件吗?在 plist 文件中存储大量数据是个好主意吗?不幸的是,我找不到将我的 .csv 文件转换为 .plist 文件的任何 在线工具我想从 plist 中读取数据没什么大不了的。
  3. 预加载的数据库需要导入CoreData,现在我正在通过这种方式工作,我成功地将我的CSV文件转换为SQLite文件并将其导入到包中,然后将其从包中复制到NSPersistentContainer 将被初始化 的文档目录。现在我对这一点有一些疑问,如下所示。

    • 我在文档目录中找到了 SQLite 文件,但实际上 只需复制 带有我的 CoreData 实体的现有 SQLite 表, 我想要的是现有 SQLite 中的一个表应该是 merge 使用我的 CoreData 实体,我是否需要为每个循环遍历表 行,然后手动将其保存到实体?如果是这样,那么它是一样的 我在第 1 点提到的情况。?
    • 在某处我发现 CoreData DB 结构 SQLite DB 结构 是不同的,所以我做了什么 - 我创建了一些虚拟数据 在 CoreData 上找到了 SQLite 文件,在那个 SQLite 文件里面我 导入来自 CSV Table 的数据,现在我使用的那个 SQLite 文件 在应用程序包中,我想我在这里实现了一些东西,因为我得到了一个 错误迁移失败,因为数据库中已经存在表不要 我需要先define Entity到DataModel中?或者不要我需要 在 SQLite 文件中创建表?(如果是这样,那么我可以在哪里 预填充数据?)

请建议我需要做什么?我怎样才能实现它?此外,如果您建议任何其他选择这样做,那就太好了。

【问题讨论】:

  • 从你所有的问题中选择一个并提出这个问题。现在这个范围太广了。用粗体字放轻松。
  • 编辑您的问题并删除不相关的信息,以便清楚您在问什么。
  • 看到这些问题和使用的字体,我的眼睛很痛

标签: ios swift sqlite core-data


【解决方案1】:

要提取 SQLite 数据库文件的实体感知版本,您可以在模拟器中运行应用程序并将生成的文件的路径打印到控制台。然后在 Core Data 完成解析/保存所有记录后使用 Finder 检索文件。

然后您可以将生成的 SQLite 文件捆绑到您的项目中并准备好使用。

【讨论】:

  • 我按照你的方法试过了,还是不行,我还在bundle中添加了三个文件:1) .sqlite 2) .sqlite-shm 3) .sqlite-wal
  • @GOPALVASANI 因为您没有删除 Core Data 的日志模式。 stackoverflow.com/questions/20062197/…
【解决方案2】:

我认为它的解决方案很糟糕。因为你很少出问题
1)你的构建会更大——你不解决这个问题。而且用户加载应用程序的时间太长。
2) 您将在捆绑应用程序中有 sqlite 文件,这意味着您不能在运行时更改此数据库。

可以通过两种方式解决:
1 方式 - 在应用程序支持目录中使用 sqlite 使两个核心数据堆栈一个只读,第二个读/写。但它使核心数据的工作复杂化。只有当您不需要更改数据在应用程序包中的存储方式时,它才可用。
2 方式 - 将 sqlite 文件复制到应用程序目录,然后使用它。但是您将拥有一个文件的两个副本。

如果你确定这样
1) 您需要制作仅适用于 debag 模式和模拟器的简单解析器。
2) 你应该使用关闭日志模式设置 Core Data (我们只需要 sqlite 文件)
How to disable WAL journal mode

options["journal_mode"] = "DELETE"

关于日志模式的更多信息
https://developer.apple.com/library/archive/qa/qa1809/_index.html

3) 在模拟器中解析您的 scv 并获取 sqlite 文件
4) 在资源中添加 sqlite 文件

但我建议发出 API 请求,如何在您的应用程序中发送数据
1) 您可以发送一些哈希或上次更新,并且只接收差异数据(不是全部)
2) 分页数据和支持hash可以只问数据此时需要多少。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 2011-06-04
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多