On Fri, Mar 26, 2010 at 11:38 AM, cliff 2 <bailey.cliff...@gmail.com> wrote:
> > Hi, > > Hopefully someone here can help where the android guys haven't been able > to. > We are having an issue with our sqlite database running on the android > platform. We are accessing the db from the sdcard on an android phone > running android 2.1. > > It works perfectly 99% of the time, but every now and again, we get > database > corruption appear randomly. We have not changed any pragmas, so synchronous > is set to full and journal_mode delete. It does not correspond to any power > failures, or application crashes, and will succeed in pulling back data > from > the database for hundreds of calls, and then fail on a query that has > worked > many times before. It can occur in a number of native calls. We have > performed integrity checks on the db in question and they return ok (prior > to the corruption - androids response to a corrupt db is to delete it, so > we > can't see its state after corruption). > > The database in question is downloaded as a complete binary and then > accessed read-only using android's rawQuery call. > > A couple of typical stack traces for when the corruption occurs: > > 03-26 14:09:50.572 E/DatabaseHelper( 1253): > android.database.sqlite.SQLiteDatabaseCorruptException: database disk image > is malformed: , while compiling: SELECT o.FieldId,o.Reference, o.Category, > o.OIndex,o.Description, c.Choice, c.Derivative FROM Option o, Choice c > WHERE > o.FieldId = c.FieldId and o.Reference = ? ORDER BY o.Option, o.OIndex > 03-26 14:09:50.572 E/DatabaseHelper( 1253): at > android.database.sqlite.SQLiteProgram.native_compile(Native Method) > 03-26 14:09:50.572 E/DatabaseHelper( 1253): at > android.database.sqlite.SQLiteProgram.compile(SQLiteProgram.java:110) > 03-26 14:09:50.572 E/DatabaseHelper( 1253): at > android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59) > 03-26 14:09:50.572 E/DatabaseHelper( 1253): at > android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49) > 03-26 14:09:50.572 E/DatabaseHelper( 1253): at > > android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:49) > 03-26 14:09:50.572 E/DatabaseHelper( 1253): at > > android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1221) > 03-26 14:09:50.572 E/DatabaseHelper( 1253): at > android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1194) > > We can run the exact same query hundreds of times and it is fine. Then all > of a sudden it fails. Another typical stack trace: > > 03-24 14:54:04.678 E/AsyncTask( 6828): RuntimeException while executing > background thread > 1045 03-24 14:54:04.678 E/AsyncTask( 6828): > android.database.sqlite.SQLiteDatabaseCorruptException: database disk image > is malformed > 1046 03-24 14:54:04.678 E/AsyncTask( 6828): at > android.database.sqlite.SQLiteQuery.native_fill_window(Native Method) > 1047 03-24 14:54:04.678 E/AsyncTask( 6828): at > android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:75) > 1048 03-24 14:54:04.678 E/AsyncTask( 6828): at > android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:288) > 1049 03-24 14:54:04.678 E/AsyncTask( 6828): at > android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:269) > 1050 03-24 14:54:04.678 E/AsyncTask( 6828): at > android.database.AbstractCursor.moveToPosition(AbstractCursor.java:171) > 1051 03-24 14:54:04.678 E/AsyncTask( 6828): at > android.database.AbstractCursor.moveToFirst(AbstractCursor.java:248) > > The one above is while trying to move to the first row in a cursor. > > (android method native_fill_window source available here: > > http://www.netmite.com/android/mydroid/frameworks/base/core/jni/android_database_SQLiteQuery.cpp > and native_compile > > http://www.netmite.com/android/mydroid/frameworks/base/core/jni/android_database_SQLiteProgram.cpp > ) > > We have been looking for some way we could be corrupting the database > through incorrect use, however we are now out of options. We have triple > checked we are opening and closing all cursors and connections correctly > and > checked there aren't multiple threads accessing the db at the same time and > nothing seems out of the ordinary when corruption occurs. > > As all we are doing is reading the database, I really can't see how we can > be corrupting it. I was wondering if anyone on this forum had experienced > anything similar in the past, or could suggest things we could do to track > down what is causing the corruption. From what I've read on the SQLite site > this type of corruption should be all but impossible, however it is > definitely happening. > > If you need any more information to help track down the problem, please let > me know. Thanks in advance for any tips, or advice to help solve this. > > > Cliff > -- > View this message in context: > http://old.nabble.com/Android-database-corruption-tp28044218p28044218.html > Sent from the SQLite mailing list archive at Nabble.com. > > _______________________________________________ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users > You're probably hitting a cache corruption issue caused by a mutex issue previously fixed. More information here: http://www.sqlite.org/src/timeline?n=8&b=2010-01-31 Not sure at this point what kind of work-arounds are available to you. HTH. -Shane _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users