将核心数据与已使用SQLite的现有应用程序一起使用

时间:2017-07-21 12:46:35

标签: ios core-data sqlite

我正在开发自2011年以来一直存在的iOS应用程序,SQLite用作主数据库。在阅读了关于核心数据并考虑其优势后,我将核心数据集成到了应用程序中。这意味着应用程序的旧部分运行在SQLite之上,新开发利用Core Data与SQLite存储,但完全将.sqlite文件与现有文件分开。但是最近几天,一些内部测试报告称现有的SQLite数据库已被破坏。但真正的原因是,现有的数据库变得只读。我深入了解互联网,最后在以下部分的sqlite.org https://www.sqlite.org/howtocorrupt.html上找到了一篇关于它的文章:

  

2.2.1。多个SQLite副本链接到同一个应用程序

     

正如前一段所述,SQLite采取措施   围绕POSIX咨询锁定的怪癖。部分解决方法   涉及保持开放SQLite的全局列表(互斥保护)   数据库文件。但是,如果将SQLite的多个副本链接到   相同的应用程序,那么这个全局将有多个实例   名单。使用SQLite库的一个副本打开数据库连接   将不知道使用其他副本打开的数据库连接,   并且将无法解决POSIX咨询锁定问题。一个   对一个连接的close()操作可能在不知不觉中清除了锁   在不同的数据库连接上,导致数据库损坏。

     

上面的情景听起来很牵强。但SQLite开发人员是   了解至少一种已发布的商业产品   正好这个bug。供应商来到SQLite开发人员那里寻求   帮助他们查找一些不常见的数据库损坏问题   在Linux和Mac上看到了。这个问题最终被追溯到了   事实上,该应用程序链接到两个单独的副本   SQLite的。解决方案是将应用程序构建过程更改为   只链接一个SQLite副本而不是两个。

我想问一下。

  1. 有没有人在这种情况下获得过经验?是否可以将Core Data与现有的SQLite数据库一起运行?
  2. 我的情况是否属于上述Multiple copies of SQLite问题?还有其他任何建议吗?
  3. 为什么Core Data会将现有的sqlite定为只读时间?

1 个答案:

答案 0 :(得分:1)

  

有没有人在这种情况下获得过经验?是否可以将Core Data与现有的SQLite数据库一起运行?

我没有这样做,但它应该是可能的。没有什么可以阻止在同一个应用程序中使用另一个。

  

我的场景是否属于上述SQLite问题的多个副本?还有其他任何建议吗?

除非您在自己的应用中嵌入自己的SQLite代码。该文档指的是具有多个SQLite副本,而不是多个数据文件。

  

为什么Core Data会将现有的sqlite定时为只读?

没有。如果您直接使用SQLite,Core Data不会知道或关心该文件。他们可能都在使用SQLite,但这并不意味着什么。核心数据不会涉及访问非核心数据文件的非核心数据代码。直接使用SQLite调用与您使用Core Data执行的任何操作都是分开的。

你的应用程序代码可能会以某种方式混合两者之间的数据,因为你只有一半在另一半。但这两种方法都不会干扰另一方。