Android Lollipop 5.0.1 SQLiteLog POSIX错误11 SQLite错误:3850

升级应用程序以支持Android Lollipop时,我遇到问题。
该应用程序实现了通过内容提供程序在数据库上写入的SyncAdapter。
同时,用户正在浏览应用程序的前端,加载程序从数据库读取相同的数据。
装载机也会听取数据更改。

现在,如果我在一个Pre-Lollipop设备上运行该程序,所有的工作都没有任何错误输出。

在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

The SQLITE_IOERR_LOCK error code is an extended error code for
SQLITE_IOERR indicating an I/O error in the advisory file locking
logic. Usually an SQLITE_IOERR_LOCK error indicates a problem
obtaining a PENDING lock. However it can also indicate miscellaneous
locking errors on some of the specialized VFSes used on Macs.
Everything seems to work properly on a high level (that is both reads
and writes are performed)

和:

A PENDING lock means that the process holding the lock wants to write
to the database as soon as possible and is just waiting on all current
SHARED locks to clear so that it can get an EXCLUSIVE lock. No new
SHARED locks are permitted against the database if a PENDING lock is
active, though existing SHARED locks are allowed to continue.

我知道SQLite版本已经被Lollipop中的几个主要版本更新了,所以我很容易认为这个错误是由于我无法隔离的一些新的SQLite行为。

但是,从更高级别的角度来看,一切似乎都可以正常工作(应用程序不会崩溃,读写都执行,帧率不会下降 – 至少对人的眼睛),但我不想忽略这个问题释放应用程序,直到我确定不会导致数据损坏或麻烦。

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

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

提前致谢

Writer锁定数据库以进行读取和写入。
这意味着它必须等待所有读者完成并释放锁以获得锁定。

在作者要求锁定之后,新的读卡器锁必须等待作者首先获得锁定然后释放它。

这可能是您的一个解决方案:WAL mode

激活和配置WAL模式:

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

PRAGMA journal_mode=WAL;

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

WAL所需的最小SQLite版本为3.7.0(2010-07-21)。
Lollipop 5.0使用SQLite 3.8.4.3,所以WAL应该可供你使用。

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

http://stackoverflow.com/questions/30478650/android-lollipop-5-0-1-sqlitelog-posix-error-11-sqlite-error-3850

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:Android Lollipop 5.0.1 SQLiteLog POSIX错误11 SQLite错误:3850