cpj*_*eur 8 database sqlite iphone
我在使用SQLite作为数据库后端的iPhone SDK上的新应用程序时遇到问题.
偶尔,我的应用程序将停止将数据加载到我的UITableViews,并在通过管理器下载设备DB后,我可以通过命令行访问SQLite DB.我可以查询某些表,但没有得到"SQL错误:数据库磁盘映像格式错误"错误的其他表.请参阅下面的sqlite会话:
SQLite version 3.6.17
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from user;
1|cpjolicoeur@gmail.com|cpjolicoeur||4d055e38bb1d3758|image/gif|cartoonme_avatar.gif||Craig|Jolicoeur|1|1
sqlite> select * from item;
SQL error: database disk image is malformed
sqlite>
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我的用户表工作正常,但我的项目表格格式不正确,这与我在我的应用程序中看到的项目不加载相对应.应用程序没有崩溃,数据只是因为这个格式错误而无法加载.
任何想法为什么会这样?我唯一的想法是,数据库可能已损坏,因为我通过应用程序中的后台线程写入SQLite数据库.我通过后台线程中的NSOperationQueue从Web服务器下载数据,并使用下载的数据更新SQLite DB.在后台线程中写入数据库(虽然可能从主线程读取)会破坏数据库,还是其他什么?
在调试时,您必须非常小心访问数据库的后台线程!这是因为当调试器暂停处理(例如在断点处)时,所有线程都被暂停,包括可能在数据库调用中间的线程,在数据库"open"和数据库"close"调用之间的某处.
如果您在断点处停止,并单击Xcode中的停止标志,您的应用会立即退出.这经常导致错误,例如您看到的错误或"损坏的数据库"错误.
确实没有任何解决方案(因为没有办法修改"停止任务"的行为,但我已经发展了一些技术来缓解它:1.添加代码以检测进入后台的应用程序并优雅地执行数据库操作2.在调试时不要使用停止标志停止处理.相反,当完成断点然后"继续"时,点击模拟器或设备上的主页按钮(应触发您在步骤1中添加的代码),等待对于应用程序的背景,那么你可以停止运行.
在我的情况下,这与iOS 7有关:在iOS 7上,Core Data现在使用SQLite WAL日记模式,该模式将数据写入.db-wal文件而不是直接写入.db文件.在我的应用程序中,我会在应用程序更新期间复制准备好的.db文件Library/Application Support.问题是旧.db-wal文件仍然在该目录中,我只替换了该.db文件.这样,我最终得到了一个.db与旧.db-wal文件不同步的文件.
这个问题有两种解决方案:
.db,请确保删除.db-wal和.db-shm文件.db.| 归档时间: |
|
| 查看次数: |
6405 次 |
| 最近记录: |