您的位置:首页 > 移动开发 > Android开发

android.database.sqlite.SQLiteException: Failed to change locale for db '/storage/sdcard0/xx/xxx.db'

2015-04-27 20:41 477 查看
诡异的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);
        }
    }


由SQLiteConnection.java 可知,设置该 flag 后, setLocale这个方法将不会执行,故不会抛出该异常

private void setLocaleFromConfiguration() {
    if ((mConfiguration.openFlags & SQLiteDatabase.NO_LOCALIZED_COLLATORS) != 0) {
            return;
    }
    ...
}


得以解决。

但 5.0 之后发现在部分特殊机型上 (努比亚 Z9 mini , 酷派大神 F2 ) 均为5.0.2 的版本上也出现了该问题。

上面的方案就无法解决问题了。

并且使用上面的open方式后,即使改回OPEN_READWRITE 也会抛出这个异常 :

SQLiteReadOnlyDatabaseException: attempt to write a readonly database


最后只能把原本存在sd卡的数据库改到 data/data/com.XX 的路径下存放咯,未找到根本原因
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐