如果我使用核心数据,如何用新文件替换 sqlite 文件?

Posted

技术标签:

【中文标题】如果我使用核心数据,如何用新文件替换 sqlite 文件?【英文标题】:How to replace sqlite file with the new one if I use core data? 【发布时间】:2015-07-28 14:12:03 【问题描述】:

我目前正在开发将使用数据库存储项目的应用程序。说到在 ios 中存储数据,大家说的第一件事就是 Core Data。

但是,在浏览了几天的教程和文档之后,我有一个大问题。

让我再解释一下架构。所以我们有一个后端,您可以在其中添加项目,此外,我们还有 iOS 和 android 应用程序。我正在为我们的数据库创建一个核心数据模型。 我们想要的是检查数据库是否有更新并下载。问题是我们不使用 JSON 或 XML,我们使用的是新的 sqlite 文件。

由于Core data为数据库创建了三个文件,分别是:

db.sqlite db.sqlite-wal db.sqlite-shm

核心数据能否用从服务器下载的新数据替换“db.sqlite”?

【问题讨论】:

【参考方案1】:

认为替换数据库文件而不是向其中导入对象的想法非常诱人,因此非常不鼓励将 CoreData 创建的 sqlite 数据库搞乱。你永远不应该手动触摸它,当你这样做时,你很可能会以损坏的数据库或混乱的数据告终。 所以不,CoreDate 不能替换底层的 sqlite 文件。相反,您应该使用 CoreData 堆栈导入数据,这就是它的设计方式。创建 JSON/XML 服务是最好的方法。

但是理论上,如果您能够保持存储在数据库中的 CD 内部信息不受影响,应该可以替换 sqlite 文件。如果您的数据库对用户是只读的,它可能可以工作,但如果用户能够创建或修改记录,那么现在就别管它了。

首先,您必须在替换之前拆除所有可能正在使用它的 CoreData 堆栈(托管对象上下文、持久存储协调器、托管对象模型),替换文件并重新创建 CoreData 堆栈.

db.sqlite 是主数据库文件,另外两个是临时文件,Write ahead log (wal) 和 Shared memory (smh),所以这两个不需要。

请记住,您永远不得更改数据库的结构,只更改其中的数据!!!

但是,如开头所述,我完全不推荐这种方法。

【讨论】:

非常感谢!你证实了我的想法。 “备份策略”是否也是一种不好的做法 我会说是的,这是一种不好的做法。例如,db 文件的结构可能会随着新的操作系统版本而改变,因此如果您将其替换为旧版本,您的应用可能会无法使用。 你能引用任何资源来支持答案吗?

以上是关于如果我使用核心数据,如何用新文件替换 sqlite 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何用 Berkeley DB 替换 SQLite

如何用新数据正确覆盖 SQLite 表行?

如何用Entity Framework 6 连接Sqlite数据库

如何用Entity Framework 6 连接Sqlite数据

如何用Entity Framework 6 连接Sqlite数据库

在将数据从文件插入表时,如何用 NULL 替换 NA 值?