We are getting a large number of SQLiteDiskIOException errors in our Android app, with stack traces similar to the following:
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)
Run Code Online (Sandbox Code Playgroud)
This recently starting happening a few weeks ago, but no significant database changes took place in the exact release in which reporting of this issue started. Despite having (I believe) appropriate indices, this exception has been reported more than we are comfortable with on cursor.moveToFirst() calls after the query completes, as you can see from the stack trace. So far, we have been completely unable to reproduce.
查询有点复杂,有三个左连接.下面是一个代表性查询,更改了一些标识列以保护无辜者.
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
Run Code Online (Sandbox Code Playgroud)
其他消息来源表明我们正试图提取太多数据,但事实并非如此.我们能够获得完整数据库行计数的三个用户案例显示:cse包含<2000个条目,其中包含<150个条目,并且预先包含0或7个条目.此外,查询中的"解释查询计划"表示所有联接都是针对索引列完成的.
在每种情况下我们都看到了这一点,用户在各种设备上运行Android 2.1(DROID,Hero,EVO,可能还有其他设备).值得注意的是,我们还没有在我们拥有的几台G1设备上看到这一点,即使它们与其他应用程序一起被加载.
最后,卸载和重新安装已经证明在清理问题方面是成功的,尽管可能只是暂时的.
我担心这个问题是Android 2.1中数据损坏的结果.有没有人有可能的建议来研究什么?这可能与SQLiteDatabaseCorruptException上的这个Android错误有关
非常感谢指导和解决方案.
您似乎有多线程问题,一个线程尝试获取数据而另一个或多个尝试将一些数据插入到表中,因为异常是从方法(getCount)抛出的.
也别忘了; SQLite游标未在内部同步,因此如果您从多个线程使用此游标,则应执行自己的同步机制.
| 归档时间: |
|
| 查看次数: |
12077 次 |
| 最近记录: |