greendao出现Failed to change locale for db ‘/data/data/xxx/databases/xxx.db‘ to ‘zh_CN‘.

Failed to change locale for db '/data/data/xxx/databases/xxx.db' to 'zh_CN'..属于数据库的错误。可能在低版本的手机上有些系统不兼容。

网上解决方案基本大同小异,在打开db的时候,添加一个新的flag就可以解决因为切换Locale导致的db异常:

greendao出现Failed to change locale for db ‘/data/data/xxx/databases/xxx.db‘ to ‘zh_CN‘._第1张图片

但是当前使用的是greendao 。在研究他的api的过程中,发现系统自带一个 类

com.android.launcher3.util.NoLocaleSQLiteHelper

但是没法直接用,于是代码拷出来继承

DaoMaster.DevOpenHelper

自定义MyOpenHelper

public class MyOpenHelper extends DaoMaster.DevOpenHelper {

    private static final boolean ATLEAST_P =
            Build.VERSION.SDK_INT >= Build.VERSION_CODES.P;

    public MyOpenHelper(Context context, String name) {
        super(ATLEAST_P ? context : new NoLocalContext(context), name);
        if (ATLEAST_P) {
            setOpenParams(new SQLiteDatabase.OpenParams.Builder().addOpenFlags(NO_LOCALIZED_COLLATORS).build());
        }
    }

    private static class NoLocalContext extends ContextWrapper {
        public NoLocalContext(Context base) {
            super(base);
        }

        @Override
        public SQLiteDatabase openOrCreateDatabase(
                String name, int mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) {
            return super.openOrCreateDatabase(
                    name, mode | Context.MODE_NO_LOCALIZED_COLLATORS, factory, errorHandler);
        }
    }
}

然后直接调用:

    MyOpenHelper  mDevOpenHelper = new MyOpenHelper(context.getApplicationContext(), getDbName());
    DaoMaster mDaoMaster = new DaoMaster(mDevOpenHelper.getReadableDatabase());

注:仅供参考,后续测试没出现该问题,但是由于是偶发现象,所以不确定是否解决问题了!!!!!!

你可能感兴趣的:(android,数据库,sqlite,database,android)