将大量数据保存到CoreData

时间:2019-06-15 12:49:29

标签: ios swift sqlite core-data

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

我知道以下实现方法。

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

    • 我在文档目录中找到了 SQLite 文件,但实际上 只需复制带有我的CoreData实体的现有SQLite表, 我想要的是现有SQLite的表之一应该合并 使用我的 CoreData实体,我是否需要遍历每个表 行,然后手动将其保存到实体?如果是这样,那么它是一样的 我在第1点提到的情况?
    • 在某些地方我发现 CoreData数据库结构 SQLite数据库结构不同,所以我做了什么-我创建了一些虚拟数据 在CoreData上找到SQLite文件,在该SQLite文件中,我 导入 CSV表中的数据,现在我已经使用了该SQLite文件 在应用程序包中,我想在这里我达到了 错误说, 迁移失败,因为数据库中已经存在表 我需要先定义实体到DataModel中?还是不需要 创建 SQLite文件中的表?( 如果是,那么在哪里可以 预先填充数据?

请提出我需要做什么?我该如何实现呢?另外,如果您建议这样做的话,也很好。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我认为解决方案不好。因为没什么问题
1)您的构建将会更大-您将无法修复它。而且用户加载应用程序的时间过长。
2)捆绑应用程序中将包含sqlite文件,这意味着您无法在运行时更改此数据库。

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

如果您以这种方式确定
1)您需要使简单的解析器仅在解包模式和模拟器下起作用。
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并在Simulator中获取sqlite文件
4)在资源中添加sqlite文件

但是我建议发出API请求,以及如何在您的应用程序中发送数据
1)您可以发送一些哈希值或最后更新,并且仅接收diff数据(不是全部)
2)您可以仅使用分页数据和支持哈希的数据询问此时数据的需求。