Android棒棒糖5.0.1 SQLiteLog POSIX错误11 SQLite错误:3850

升级应用程序以支持Android棒棒糖时遇到问题。 该应用程序实现了一个通过内容提供者在数据库上写入的SyncAdapter。 同时,可能会发生这样的情况:用户正在浏览装载器从数据库中读取相同数据的应用程序的前端。 装载机也听取数据更改。

现在,如果我在前棒棒糖设备上运行程序,一切都没有任何错误输出。

在棒棒糖,而是我收到以下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的扩展错误代码,用于指示咨询文件locking逻辑中的I / O错误。 通常,SQLITE_IOERR_LOCK错误表示获取PENDING锁的问题。 但是,它也可以指示在Mac上使用的某些专用VFS上的其他locking错误。 一切似乎在高层次上正常工作(即执行读取和写入)

和:

挂起锁意味着持有锁的进程想要尽快写入数据库,并且正在等待所有当前的SHARED锁清除,以便它可以获得一个EXCLUSIVE锁。 如果PENDING锁处于活动状态,则不允许对数据库使用新的SHARED锁,尽pipe现有的SHARED锁允许继续。

我知道SQLite版本已经在棒棒糖的几个主要版本中进行了更新,所以我倾向于认为这个错误是由于我无法隔离的SQLite的一些新行为。

然而,从更高级别的angular度来看,一切似乎都正常工作(应用程序不会崩溃,读取和写入都执行,帧速率不会下降 – 至less在人眼中),但是我不想忽略这个问题发布应用程序,直到我确信它不会导致数据损坏或麻烦。

也许我缺less关于锁和多进程数据库访问的棒棒糖的一些重要变化,但我觉得这是一个关于Art / Dalvik域的较低级别的问题,因此必须在NDK上下文中修复。

有没有办法解决这个可能没有分发一个应用程序特定版本的SQLite? 有没有清单/ SQLite选项来避免错误?

提前致谢

Solutions Collecting From Web of "Android棒棒糖5.0.1 SQLiteLog POSIX错误11 SQLite错误:3850"

Writerlocking数据库的读取和写入。 这意味着它必须等待所有读者完成并释放锁才能获得locking。

在写入者请求locking之后,新的读取器locking必须等待写入者首先获得locking然后释放locking。

这可能是您的解决scheme: WAL模式

激活和configurationWAL模式:

SQLite数据库连接默认为journal_mode = DELETE。 要转换为WAL模式,请使用以下附注:

 PRAGMA journal_mode=WAL; 

WAL不会在写入时阻止读者,这也意味着作者不需要等待当前的读取锁被释放。

WAL所需的最低SQLite版本是3.7.0(2010-07-21) 。 棒棒堂5.0使用SQLite 3.8.4.3所以WAL应该为您提供。

但是Android版本中不存在WAL,但是有一些例外。 看看在Android中使用的SQLite的版本? 。 如果你不需要你的应用程序在Android 3.0下工作,你可以使用WAL。