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

Android棒棒糖5.0.1 SQLiteLog POSIX错误11 SQLite错误:3850,android,multithreading,sqlite,posix,android-5.0-lollipop,Android,Multithreading,Sqlite,Posix,Android 5.0 Lollipop,我在升级一个支持Android棒棒糖的应用程序时遇到了一个问题。 该应用程序实现了一个SyncAdapter,可通过内容提供商在db上写入数据。 同时,用户可能正在浏览应用程序的前端,加载程序从数据库中读取相同的数据。 加载程序还侦听数据更改 现在,如果我在棒棒糖前的设备上运行这个程序,一切都会正常工作,没有任何错误输出 在棒棒糖上,我收到以下logcat消息: 11:20:59.344 22341-22376/com.example.com E/SQLiteLog﹕ (10) POSIX E

我在升级一个支持Android棒棒糖的应用程序时遇到了一个问题。 该应用程序实现了一个SyncAdapter,可通过内容提供商在db上写入数据。 同时,用户可能正在浏览应用程序的前端,加载程序从数据库中读取相同的数据。 加载程序还侦听数据更改

现在,如果我在棒棒糖前的设备上运行这个程序,一切都会正常工作,没有任何错误输出

在棒棒糖上,我收到以下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\u IOERR\u锁

SQLITE_IOERR_LOCK错误代码是的扩展错误代码 SQLITE_IOERR指示建议文件锁定中的I/O错误 逻辑。通常,SQLITE_IOERR_LOCK错误表示存在问题 获取挂起的锁。但是,它也可以表示杂项 Mac上使用的某些专用VFSE上的锁定错误。 在高水平上,一切似乎都正常工作(即两者都正常) (并执行写入操作)

以及:

挂起的锁意味着持有锁的进程想要写入 尽快发送到数据库,并且正在等待所有当前 要清除的共享锁,以便它可以获得独占锁。没有新的 如果存在挂起的锁,则允许对数据库使用共享锁 活动,但允许继续使用现有共享锁

我知道,在Lollipop中,SQLite版本已经被少数几个主要版本更新了,所以我倾向于认为错误是由于SQLite的一些新行为造成的,我无法隔离这些行为

然而,从更高的角度来看,一切似乎都很好(应用程序不会崩溃,读写都会执行,帧速率不会下降——至少对人来说是这样),但我不想忽视发布应用程序的问题,直到我确信它不会导致数据损坏或问题

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

有没有一种方法可以在不分发特定于应用程序的SQLite版本的情况下解决这个问题?是否有任何manifest/SQLite选项可以避免此错误


提前感谢

Writer为读写操作锁定数据库。 这意味着它必须等待所有读卡器完成并释放锁才能获得锁

写入程序请求锁后,新的读卡器锁必须等待写入程序首先获取锁,然后释放它

这可能是您的解决方案:

激活和配置WAL模式:

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

WAL在写入时不会阻止读卡器,这也意味着写入器不需要等待当前读锁被释放

沃尔玛要求的SQLite最低版本为3.7.0(2010-07-21)。 棒棒糖5.0使用SQLite 3.8.4.3,所以您应该可以使用WAL

但是WAL在低于3.0的Android版本中并不存在,尽管有一些例外。看一看。如果你不需要你的应用程序在Android 3.0下运行,你可以使用WAL

PRAGMA journal_mode=WAL;