I've been having a few crashes that have been coming up more often recently and i cannot figure out how to reproduce them or fix them. Here is the one that comes up most often
Fatal Exception: java.lang.RuntimeException: Unable to create application com.myapp.MyApplication: android.database.sqlite.SQLiteDiskIOException: disk I/O error (code 1802): , while compiling: PRAGMA journal_mode
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5436)
at android.app.ActivityThread.-wrap2(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1546)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6154)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
Caused by android.database.sqlite.SQLiteDiskIOException: disk I/O error (code 1802): , while compiling: PRAGMA journal_mode
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(SQLiteConnection.java)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
at android.database.sqlite.SQLiteConnection.executeForString(SQLiteConnection.java:634)
at android.database.sqlite.SQLiteConnection.setJournalMode(SQLiteConnection.java:320)
at android.database.sqlite.SQLiteConnection.setWalModeFromConfiguration(SQLiteConnection.java:294)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:215)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193)
at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:808)
at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:793)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:696)
at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:680)
at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:289)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
at com.myapp.DBConnect.getInstance(DBConnect.java:202)
at com.myapp.MyApplication.onCreate(MyApplication.java:66)
Every search I try makes it sound like the issue is with trying to open the database from different threads. However, I thought I had a setup to avoid this by having a static method in the helper class to get the current instance.
private static DBConnect mInstance = null;
private static SQLiteDatabase db;
public static DBConnect getInstance(Context ctx) {
if (mInstance == null) {
mInstance = new DBConnect(ctx.getApplicationContext());
db = mInstance.getWritableDatabase(); // this is line 202 in DBConnect.java
// all methods in this class reference this db var to run database queries
}
return mInstance;
}
and then wherever i need to access the database I have a local variable db set by using this line:
// this is line 66 in MyApplication.java
DBConnect db = DBConnect.getInstance(this);
then run all my database queries with functions like db.addItem()
It has been working fine and I am 90% sure multiple threads are accessing the same tables without me ever seeing crashes. The app has a couple lists which sync in the background in several places, the easiest one to reproduce is when the app first launches it performs a sync of these lists. While it is syncing the user can view the different lists, loading each list is selecting its contents from the database, possibly while items are being added or deleted from the same tables in the background sync process. I also have a couple hundred active users a day and have only seen this kind of crash 15 times over the last few months.
Also, seeing that the first line of the error is java.lang.RuntimeException: Unable to create application ..., It seems like this is happening when the user first launches the app? Not sure how there could already be multiple threads at this point, none of the background processes run unless the user has signed in.
I am also seeing the following error caused by the same line:
Failed to change locale for db '/data/user/0/com.myapp/databases/mydb' to 'en_US'.
I have tried changing locale settings on my phone, reinstalling the app and then messing around to see if i get this problem. I even tried switching back to English after installing using another locale but have not been able to repeat this crash. I have a feeling they might be related since they both seem to be happening on startup.