SQLiteDiskIOException в Android

Мы получаем большое количество SQLiteDiskIOException ошибки в нашем приложении для Android, с отслеживаниями стека, подобными следующему:

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() вызовы после запроса завершаются, как Вы видите от отслеживания стека. До сих пор мы абсолютно не могли воспроизвести.

Запрос является несколько сложным с тремя левыми соединениями. Ниже представительный запрос, с некоторыми столбцами идентификации, измененными для защиты невинного.

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

Другие источники предположили, что мы пытаемся вытащить слишком много данных, но это - просто не случай. Три пользовательских случая, где мы смогли получить полную базу данных rowcounts шоу: cse с <записи 2000 года, emed с <150 записей, и пред или с 0 или с 7 записями. Кроме того, 'объясните, что план запросов' на запросе указывает, что все соединения сделаны против индексированных столбцов.

В каждом случае мы видели это, пользователь выполнял Android 2.1 на множестве устройств (DROID, Герой, EVO, возможно другие). В частности, мы не видели это на паре устройств G1, которые мы имеем, даже когда они перегружены с другими приложениями.

Наконец, удаление и переустановка оказались успешными в чистке проблемы, хотя возможно только временно.

Я боюсь, что этой проблемой является результат повреждения данных в Android 2.1. У кого-либо есть возможные предложения того, что изучить? Мог это быть связанным с этой ошибкой Android на SQLiteDatabaseCorruptException

Руководство и решения очень ценятся.

10
задан Macarse 11 July 2010 в 01:48
поделиться