【发布时间】:2015-05-27 09:39:25
【问题描述】:
我在升级应用程序以支持 Android Lollipop 时遇到问题。 该应用程序实现了一个 SyncAdapter,它通过内容提供程序在数据库上写入。 同时,用户可能正在浏览应用程序的前端,加载程序从数据库中读取相同的数据。 加载器还会监听数据变化。
现在,如果我在棒棒糖之前的设备上运行程序,一切正常,没有任何错误输出。
在 Lollipop 上,我收到以下 logcat 消息:
11:20:59.344 22341-22376/com.example.com E/SQLiteLog﹕ (10) POSIX Error : 11 SQLite Error : 3850
11:20:59.364 22341-22376/com.example.com E/SQLiteLog﹕ (10) POSIX Error : 11 SQLite Error : 3850
11:20:59.364 22341-22376/com.example.com E/SQLiteLog﹕ (10) POSIX Error : 11 SQLite Error : 3850
11:20:59.364 22341-22376/com.example.com E/SQLiteLog﹕ (10) POSIX Error : 11 SQLite Error : 3850
现在,来自 SQLite 文档:
(3850) SQLITE_IOERR_LOCK
SQLITE_IOERR_LOCK 错误代码是一个扩展错误代码 SQLITE_IOERR 指示咨询文件锁定中的 I/O 错误 逻辑。通常 SQLITE_IOERR_LOCK 错误表明存在问题 获得一个 PENDING 锁。但是它也可以表示杂项 Mac 上使用的一些专用 VFS 上的锁定错误。 一切似乎都在高水平上正常工作(即读取 并执行写入)
和:
一个 PENDING 锁意味着持有锁的进程想要写 尽快到数据库,只是等待所有当前 SHARED 锁要清除,以便它可以得到一个 EXCLUSIVE 锁。没有新的 如果 PENDING 锁是允许对数据库的共享锁 处于活动状态,但允许继续使用现有的 SHARED 锁。
我知道 SQLite 版本已经被 Lollipop 中的几个主要版本更新,所以我很容易认为错误是由于我无法隔离的 SQLite 的一些新行为造成的。
但是,从更高级别的角度来看,一切似乎都运行良好(应用程序不会崩溃,读取和写入都会执行,帧率不会下降 - 至少在人眼看来)但我不想忽略发布应用程序的问题,直到我确定它不会导致数据损坏或问题。
也许我错过了关于锁和多进程数据库访问的棒棒糖的一些重要更改,但我觉得这是一个相对于 Art/Dalvik 域而言处于较低级别的问题,因此必须在 NDK 上下文中修复.
有没有办法在不分发特定于应用程序的 SQLite 版本的情况下解决这个问题?是否有任何清单/SQLite 选项可以避免该错误?
提前致谢
【问题讨论】:
标签: android multithreading sqlite posix android-5.0-lollipop