诡异的Exception,首先一次是发现在 4.0.3 和 4.0.4 的版本中。
按许多网上的解决方案:
//使用 SQLiteDatabase.CREATE_IF_NECESSARY | SQLiteDatabase.NO_LOCALIZED_COLLATORS 的方式 去open DataBase
private SQLiteDatabase openOrCreateDatabase(String path, CursorFactory factory) {
// 4.0.x 使用特殊方式创建资源 Android 4.0.3, 4.0.4 15 ; 4.0, 4.0.1, 4.0.2 14
if (android.os.Build.VERSION.SDK_INT == 14 || android.os.Build.VERSION.SDK_INT == 15) {
return SQLiteDatabase.openDatabase(path, factory, SQLiteDatabase.CREATE_IF_NECESSARY | SQLiteDatabase.NO_LOCALIZED_COLLATORS);
} else {
return mContext.openOrCreateDatabase(path, SQLiteDatabase.OPEN_READWRITE, factory);
}
}123456789
由SQLiteConnection.java 可知,设置该 flag 后, setLocale这个方法将不会执行,故不会抛出该异常
private void setLocaleFromConfiguration() {
if ((mConfiguration.openFlags & SQLiteDatabase.NO_LOCALIZED_COLLATORS) != 0) {
return;
}
...
}123456
得以解决。
但 5.0 之后发现在部分特殊机型上 (努比亚 Z9 mini , 酷派大神 F2 ) 均为5.0.2 的版本上也出现了该问题。
上面的方案就无法解决问题了。
并且使用上面的open方式后,即使改回OPEN_READWRITE 也会抛出这个异常 :
SQLiteReadOnlyDatabaseException: attempt to write a readonly database1
最后只能把原本存在sd卡的数据库改到 data/data/com.XX 的路径下存放咯,未找到根本原因