Android棒棒糖5.0.1 SQLiteLog POSIX错误11 SQLite错误:3850
我在升级一个支持Android棒棒糖的应用程序时遇到了一个问题。 该应用程序实现了一个SyncAdapter,可通过内容提供商在db上写入数据。 同时,用户可能正在浏览应用程序的前端,加载程序从数据库中读取相同的数据。 加载程序还侦听数据更改 现在,如果我在棒棒糖前的设备上运行这个程序,一切都会正常工作,没有任何错误输出 在棒棒糖上,我收到以下logcat消息: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
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;