【问题标题】:Android Lollipop 5.0.1 SQLiteLog POSIX Error 11 SQLite Error: 3850Android Lollipop 5.0.1 SQLiteLog POSIX 错误 11 SQLite 错误:3850
【发布时间】: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


    【解决方案1】:

    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。

    但是在低于 3.0 的 Android 版本中不存在 WAL,尽管有一些例外。看看Version of SQLite used in Android?。如果您不需要您的应用在 Android 3.0 以下运行,您可以使用 WAL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      • 2018-09-20
      • 2016-06-22
      相关资源
      最近更新 更多