I am working on an Android application that uses the createOrUpdate method to add objects to an SQLite database.
This is an exception that throws (inconsistently):
Caused by: android.database.sqlite.SQLiteReadOnlyDatabaseException:attempt to write a readonly database (code 1032)
Manifest permissions include WRITE_EXTERNAL_STORAGE.
This exception seems to occur in two places, inconsistently, but each time this try / catch is executed:
try { getDatabaseHelper().getAccountDao().createOrUpdate(aAccount); } catch (SQLException e) { CrashlyticsLog.e(LOGTAG, "Encountered a problem when attempting to synchronize local " + "database with login response object", e); }
We retrieve our DatabaseHelper instance from the Application class:
public DatabaseHelper getDatabaseHelper() { if (databaseHelper == null) { databaseHelper = OpenHelperManager.getHelper(this, DatabaseHelper.class); } return databaseHelper; }
Here is the full stack trace (I changed the package name):
java.sql.SQLException: Unable to run insert stmt on object com.example.Account@3bca6 : INSERT INTO `accounts` (`id` ,`logo` ,`company` ,`subdomain` ,`plan_id` , `plan_expires` ,`timezone_id` ,`timezone_name` ,`settings` ,`created_at`, `updated_at` ) VALUES (?,?,?,?,?,?,?,?,?,?,?) at com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:22) at com.j256.ormlite.stmt.mapped.MappedCreate.insert(MappedCreate.java:124) at com.j256.ormlite.stmt.StatementExecutor.create(StatementExecutor.java:394) at com.j256.ormlite.dao.BaseDaoImpl.create(BaseDaoImpl.java:308) at com.j256.ormlite.dao.BaseDaoImpl.createOrUpdate(BaseDaoImpl.java:334) at com.example.ui.account.AccountsActivity.loginUser(AccountsActivity.java:151) at com.example.ui.account.fragment.AccountListFragment.onListItemClick(AccountListFragment.java:240) at android.support.v4.app.ListFragment$2.onItemClick(ListFragment.java:58) at android.widget.AdapterView.performItemClick(AdapterView.java:305) at android.widget.AbsListView.performItemClick(AbsListView.java:1146) at android.widget.AbsListView$PerformClick.run(AbsListView.java:3053) at android.widget.AbsListView$3.run(AbsListView.java:3860) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5257) at java.lang.reflect.Method.invoke(Method.java) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) Caused by: java.sql.SQLException: inserting to database failed: INSERT INTO `accounts` (`id` ,`logo` ,`company` ,`subdomain` ,`plan_id` ,`plan_expires` ,`timezone_id`, `timezone_name` ,`settings` ,`created_at` ,`updated_at` ) VALUES (?,?,?,?,?,?,?,?,?,?,?) at com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:22) at com.j256.ormlite.android.AndroidDatabaseConnection.insert(AndroidDatabaseConnection.java:159) at com.j256.ormlite.stmt.mapped.MappedCreate.insert(MappedCreate.java:89) at com.j256.ormlite.stmt.StatementExecutor.create(StatementExecutor.java:394) at com.j256.ormlite.dao.BaseDaoImpl.create(BaseDaoImpl.java:308) at com.j256.ormlite.dao.BaseDaoImpl.createOrUpdate(BaseDaoImpl.java:334) at com.thisclicks.wiw.ui.account.AccountsActivity.loginUser(AccountsActivity.java:151) at com.thisclicks.wiw.ui.account.fragment.AccountListFragment.onListItemClick(AccountListFragment.java:240) at android.support.v4.app.ListFragment$2.onItemClick(ListFragment.java:58) at android.widget.AdapterView.performItemClick(AdapterView.java:305) at android.widget.AbsListView.performItemClick(AbsListView.java:1146) at android.widget.AbsListView$PerformClick.run(AbsListView.java:3053) at android.widget.AbsListView$3.run(AbsListView.java:3860) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5257) at java.lang.reflect.Method.invoke(Method.java) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) Caused by: android.database.sqlite.SQLiteReadOnlyDatabaseException: attempt to write a readonly database (code 1032) at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(SQLiteConnection.java) at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782) at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788) at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86) at com.j256.ormlite.android.AndroidDatabaseConnection.insert(AndroidDatabaseConnection.java:147) at com.j256.ormlite.stmt.mapped.MappedCreate.insert(MappedCreate.java:89) at com.j256.ormlite.stmt.StatementExecutor.create(StatementExecutor.java:394) at com.j256.ormlite.dao.BaseDaoImpl.create(BaseDaoImpl.java:308) at com.j256.ormlite.dao.BaseDaoImpl.createOrUpdate(BaseDaoImpl.java:334) at com.example.ui.account.AccountsActivity.loginUser(AccountsActivity.java:151) at com.example.ui.account.fragment.AccountListFragment.onListItemClick(AccountListFragment.java:240) at android.support.v4.app.ListFragment$2.onItemClick(ListFragment.java:58) at android.widget.AdapterView.performItemClick(AdapterView.java:305) at android.widget.AbsListView.performItemClick(AbsListView.java:1146) at android.widget.AbsListView$PerformClick.run(AbsListView.java:3053) at android.widget.AbsListView$3.run(AbsListView.java:3860) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5257) at java.lang.reflect.Method.invoke(Method.java) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Any help would be appreciated!