gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-28 23:26:38 26 4
gpt4 key购买 nike

我在升级应用程序以支持 Android Lollipop 时遇到问题。该应用程序实现了一个 SyncAdapter,它通过内容提供程序在数据库上写入。同时,用户可能正在浏览应用程序的前端,加载程序从数据库中读取相同的数据。加载器还会监听数据变化。

现在,如果我在 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 的一些新行为造成的。

但是,从更高级别的角度来看,一切似乎都运行良好(应用程序不会崩溃,读取和写入都会执行,帧率不会下降 - 至少在人眼看来)但我不想忽略发布应用程序的问题,直到我确定它不会导致数据损坏或问题。

也许我错过了一些关于锁和多进程数据库访问的 Lollipop 的重要更改,但我觉得这是一个相对于 Art/Dalvik 域而言处于较低级别的问题,因此必须在 NDK 上下文中修复.

有没有办法在不分发特定于应用程序的 SQLite 版本的情况下解决这个问题?是否有任何 list /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。

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

关于Android Lollipop 5.0.1 SQLiteLog POSIX 错误 11 SQLite 错误 : 3850,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30478650/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com