SQLiteException – file is encrypted or is not a database

SQLiteOpenHelper で表題の例外が出てしまったので対策メモ。
 LogCat:

02-22 17:26:58.351: ERROR/Database(23305): Failed to setLocale() when constructing, closing the database
02-22 17:26:58.351: ERROR/Database(23305): android.database.sqlite.SQLiteException: file is encrypted or is not a database
02-22 17:26:58.351: ERROR/Database(23305): at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)
02-22 17:26:58.351: ERROR/Database(23305): at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1751)
02-22 17:26:58.351: ERROR/Database(23305): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1701)
02-22 17:26:58.351: ERROR/Database(23305): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:739)
02-22 17:26:58.351: ERROR/Database(23305): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:761)
02-22 17:26:58.351: ERROR/Database(23305): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:754)
02-22 17:26:58.351: ERROR/Database(23305): at android.app.ApplicationContext.openOrCreateDatabase(ApplicationContext.java:497)
02-22 17:26:58.351: ERROR/Database(23305): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:193)
02-22 17:26:58.351: ERROR/Database(23305): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
// 以下アプリ内の getWritableDatabase() 参照箇所に続く

原因を調べたところ、どうもSQLiteのデータベースファイルが破損されているようなので、接続時にエラーの時はファイルをクリアして再接続するようにオーバーライド実装して対応しました。

@Override
public synchronized SQLiteDatabase getWritableDatabase() {
        try {
                return super.getWritableDatabase();
        } catch (SQLiteException e) {
                final File file = mContext.getDatabasePath(DATABASE_NAME);
                file.delete();
                return super.getWritableDatabase();
        }
}
 
@Override
public synchronized SQLiteDatabase getReadableDatabase() {
        try {
                return super.getReadableDatabase();
        } catch (SQLiteException e) {
                final File file = mContext.getDatabasePath(DATABASE_NAME);
                file.delete();
                return super.getReadableDatabase();
        }
}

参考:
http://d.hatena.ne.jp/esmasui/20091103/1257276598