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

诡异的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 的路径下存放咯,未找到根本原因

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值