在同一个数据库上同时使用 core-data 和基于 sqlite c 的 api

Posted

技术标签:

【中文标题】在同一个数据库上同时使用 core-data 和基于 sqlite c 的 api【英文标题】:Use core-data and sqlite c based api simultaneously on same db 【发布时间】:2015-10-05 18:56:49 【问题描述】:

AFAIK CoreData 可以配置为在持久存储中使用 sqlite。

因此 core-data 不提供使用 SQL 进行查询的方式。

所以 core-data 在后台有 sqlite db。

同时使用基于 Core-Data 和 Sqlite c 的 api 访问同一个数据库是否安全?

是否会导致任何数据损坏是 sqllite 或任何线程问题。

我要使用任何包装器(如 FMDB 或基于 C 的 API)的原因是使用 sql 查询来查询复杂数据

【问题讨论】:

【参考方案1】:

这可能是安全的,但它仍然是一个非常糟糕的主意。 Core Data 定义了它自己的模式,它是未记录的,并且与你设计 SQL 模式时使用的不同。因此,您必须创建 Core Data 模型,然后对自己的架构进行逆向工程以进行直接 SQL 调用。

当然,要在完全不同的调用风格之间保持同步更改绝对是一件非常痛苦的事情。

这是一个坏主意,即使它不会损坏您的数据。你会后悔使用这种方法。

【讨论】:

core-data 定义了它自己的模式......我不明白这部分......在后台核心数据只使用 sqlite......所以对象将被转换为表及其属性为列..那么为此编写自己的sql有多难..你能为我解释一下吗 Core Data 实体被转换为 SQLite 表,但 Core Data 所做的不仅仅是为了它自己的内部使用。实际的方案将类似于数据模型,但会有其他额外的细节没有记录,但核心数据必须具有正确的值才能使用该文件。 而这些额外的细节将来会发生变化。 但无论如何我们可以通过实体名称和属性与 sqlite-able 进行交互 表名和字段名将与 Core Data 模型中使用的名称不匹配。【参考方案2】:

在并发和子查询表达式存在之前,我曾经这样做过。在使用 sql 之前,我必须让 Core Data 将所有内容保存到磁盘。它当时有效,但您永远不知道它是否会在未来的 OS X 中有效。现在我不会这样做。如果您需要复杂的查询,请仅使用 Sqlite 或使用 Core Data 并创造性地使用谓词和获取请求。

【讨论】:

以上是关于在同一个数据库上同时使用 core-data 和基于 sqlite c 的 api的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 上 Core-Data 中的字符串被截断

Core-Data 后台保存性能问题

如何在 Mac 和 iPhone 之间同步 Core-Data 应用程序?

如何使用 core-data 存储一个值? (迅速 2)

使用 xcode 和 core-data 中的代码创建托管对象

在单个 NSTableView (Core-Data) 中显示来自多个实体的数据