gpt4 book ai didi

android - Android 中的 SQLiteDiskIOException

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:07:24 26 4
gpt4 key购买 nike

我们的 Android 应用程序中出现大量 SQLiteDiskIOException 错误,堆栈跟踪类似于以下内容:

E/AndroidRuntime( 2252): Caused by: android.database.sqlite.SQLiteDiskIOException: disk I/O error
E/AndroidRuntime( 2252): at android.database.sqlite.SQLiteQuery.native_fill_window(Native Method)
E/AndroidRuntime( 2252): at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:75)
E/AndroidRuntime( 2252): at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:288)
E/AndroidRuntime( 2252): at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:269)
E/AndroidRuntime( 2252): at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:171)
E/AndroidRuntime( 2252): at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:248)
E/AndroidRuntime( 2252): at com.company.android.CActivity$QueryTask.doInBackground(CActivity.java:1660)

这最近从几周前开始发生,但在开始报告此问题的确切版本中没有发生重大的数据库更改。尽管有(我相信)适当的索引,但在查询完成后,在 cursor.moveToFirst() 调用中报告此异常的次数超出了我们的预期,正如您从堆栈跟踪中看到的那样。到目前为止,我们已经完全无法重现。

查询有点复杂,有3个left join。下面是一个有代表性的查询,其中一些标识列已更改以保护无辜者。

select distinct c._id as _id,c.type as type,c.name as name,c.slug as slug,c.description as description,c.extra1 as extra1,c.extra2 as extra2,c.extra3 as extra3,c.extra4 as extra4,c.extra5,c.extra6 as extra6,c.extra7 as extra7,c.extra8 as extra8, c.extra9 as extra9,c.sslug as sslug,
c2.name as sname,
p.type as prel,
em.dS as dS,em.eS as eS
from cse as c
left join cse as c2 on c.sslug=c2.slug
left join emed as em on c.slug=em.slug
left join pre as p on c.sslug=p.slug
where c.pslug='slug' AND c.user='user' AND c.csource='csource'
order by c.type asc, c.extra6 desc, c.sortorder asc

其他消息来源暗示我们试图提取过多数据,但事实并非如此。我们能够获得完整数据库行数的三个用户案例显示:cse < 2000 个条目,包含 <150 个条目,并且pre 有 0 或 7 个条目。此外,查询中的“解释查询计划”表示所有连接都是针对索引列完成的。

在我们看到的每种情况下,用户都在各种设备(DROID、Hero、EVO,可能还有其他设备)上运行 Android 2.1。值得注意的是,我们还没有在我们拥有的几台 G1 设备上看到这种情况,即使它们加载了其他应用程序也是如此。

最后,卸载并重新安装已证明可以成功解决问题,尽管可能只是暂时的。

我担心这个问题是 Android 2.1 中数据损坏的结果。有没有人对要研究的内容有可能的建议?这可能与this Android bug on SQLiteDatabaseCorruptException有关吗?

非常感谢指导和解决方案。

最佳答案

您似乎遇到了多线程问题,一个线程试图获取数据,而另一个线程或多个线程试图将一些数据插入您的表中,因为异常是从方法 (getCount) 中抛出的。

也别忘了; SQLite 游标不是内部同步的,所以如果你从多个线程使用这个游标,你应该执行你自己的同步机制。

关于android - Android 中的 SQLiteDiskIOException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3220482/

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