我在 iPhone SDK 上使用 SQLite 作为数据库后端的新应用程序时遇到问题。
有时,我的应用程序会停止将数据加载到 UITableViews,通过管理器下载设备数据库后,我可以通过命令行访问 SQLite 数据库。我可以很好地查询某些表,但不能查询其他表,而不会收到“SQL 错误:数据库磁盘映像格式错误”错误。请参阅下面的 sqlite 会话:
SQLite version 3.6.17
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from user;
1|[email protected]|cpjolicoeur||4d055e38bb1d3758|image/gif|cartoonme_avatar.gif||Craig|Jolicoeur|1|1
sqlite> select * from item;
SQL error: database disk image is malformed
sqlite>
在此示例中,我的用户表工作正常,但我的项目表格式错误,这与我在应用程序中看到的项目不加载的情况相对应。应用程序不会崩溃,只是由于此格式错误而无法加载数据。
有什么想法为什么会发生这种情况吗?我唯一的想法是数据库可能已损坏,因为我正在通过应用程序内的后台线程写入 SQLite 数据库。我通过后台线程中的 NSOperationQueue 从网络服务器下载数据,并使用下载的数据更新 SQLite DB。在后台线程中写入数据库(同时可能从主线程读取)是否会损坏数据库,或者是其他原因?
调试时必须非常小心后台线程访问数据库!这是因为当调试器停止处理(例如在断点处)时,所有线程都将暂停,包括可能处于数据库调用中间(介于数据库“打开”和数据库“关闭”调用之间)的线程。
如果您在断点处停止,并单击 Xcode 中的停止标志,您的应用程序将立即退出。这通常会导致错误,例如您所看到的错误或“数据库损坏”错误。
确实没有任何解决方案(因为没有办法修改“停止任务”的行为,但我已经发展了一些技术来缓解它:
1. 添加代码以检测应用程序进入后台并让您的数据库操作正常停止。
2. 调试时切勿使用停止符号来停止处理。相反,当完成断点后“继续”,点击模拟器或设备上的主页按钮(这应该触发您在步骤 1 中添加的代码),等待应用程序进入后台,然后您可以停止运行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)