我正在开发自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副本而不是两个。
我想问一下。
Multiple copies of SQLite
问题?还有其他任何建议吗?答案 0 :(得分:1)
有没有人在这种情况下获得过经验?是否可以将Core Data与现有的SQLite数据库一起运行?
我没有这样做,但它应该是可能的。没有什么可以阻止在同一个应用程序中使用另一个。
我的场景是否属于上述SQLite问题的多个副本?还有其他任何建议吗?
除非您在自己的应用中嵌入自己的SQLite代码。该文档指的是具有多个SQLite副本,而不是多个数据文件。
为什么Core Data会将现有的sqlite定时为只读?
没有。如果您直接使用SQLite,Core Data不会知道或关心该文件。他们可能都在使用SQLite,但这并不意味着什么。核心数据不会涉及访问非核心数据文件的非核心数据代码。直接使用SQLite调用与您使用Core Data执行的任何操作都是分开的。
你的应用程序代码可能会以某种方式混合两者之间的数据,因为你只有一半在另一半。但这两种方法都不会干扰另一方。