Android中的GreenDao框架修改数据库的存储路径

来源:互联网 发布:mac上弹钢琴的软件 编辑:程序博客网 时间:2024/04/29 15:26
       目前android中比较热门的数据库框架有greenDAO、OrmLite、AndrORM,其中我比较喜欢用GreenDao,其运行效率最高,内存消耗最少,性能最佳。具体怎么使用GreenDao,网上随便搜搜都会有很多资料介绍。不过最近,在我的项目我需要改变数据库的存储位置,而android默认是在/data/data/Package Name/database创建数据库文件,

我首先想到的GreenDao有没有提供这样的接口去修改存储路径,不过我好像没有发现这样的接口。

于是我查看在GreenDao中生成的DaoMaster类:

 public static abstract class OpenHelper extends SQLiteOpenHelper {
        public OpenHelper(Context context, String name, CursorFactory factory) {
            super(context, name, factory, SCHEMA_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION);
            createAllTables(db, false);
        }
 }

 public static class DevOpenHelper extends OpenHelper {
        public DevOpenHelper(Context context, String name, CursorFactory factory) {
            super(context, name, factory);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
            dropAllTables(db, true);
            onCreate(db);
        }
 }

从上面这段可以看出GreenDap框架实际也是对原生数据库作了一层封装,数据库的创建、升级等仍然是继承SQLiteOpenHelper 来操作,于是我只能去看原生数据库中的SQLiteOpenHelper 类,该类中的getDatabaseLocked方法,也是在创建数据库的时候一定会调用的方法,其中有这样一段:

 if (DEBUG_STRICT_READONLY && !writable) {

       final String path = mContext.getDatabasePath(mName).getPath();
       db = SQLiteDatabase.openDatabase(path, mFactory,
       SQLiteDatabase.OPEN_READONLY, mErrorHandler);
 } else {
       db = mContext.openOrCreateDatabase(mName, mEnableWriteAheadLogging ?
       Context.MODE_ENABLE_WRITE_AHEAD_LOGGING : 0,
       mFactory, mErrorHandler);
 }

没错,貌似我们已经看到了什么,数据库的默认存储路径采用的是mContext.getDatabasePath(mName),数据库名称需要指定,而路径即为使用到的Context也就是上下文的数据库路径,getDatabasePath(String name)就是上面提到过得默认路径,所以我们需要去自定义一个上下文继承自ContextWrapper,然后复写getDatabasePath(String name)方法,下面是我自定义的一个DatabaseContext ,修改了数据库路径为SD卡上的databases目录下:

public class DatabaseContext extends ContextWrapper {
     public DatabaseContext(Context base) {
           super(base);
     }
    /**
     * 获得数据库路径,如果不存在,则自动创建
     */
    @Override
    public File getDatabasePath(String name) {
        //判断是否存在sd卡
        boolean sdExist = android.os.Environment.MEDIA_MOUNTED.equals(android.os.Environment.getExternalStorageState());
        if(!sdExist){//如果不存在,
            Log.e("SD卡管理:", "SD卡不存在,请加载SD卡");
            return null;
        }
        else{//如果存在
            //获取sd卡路径
            String dbDir=android.os.Environment.getExternalStorageDirectory().toString();
            dbDir += "/databases";//数据库所在目录
            String dbPath = dbDir+"/"+name;//数据库路径
            //判断目录是否存在,不存在则创建该目录
            File dirFile = new File(dbDir);
            if(!dirFile.exists())
                dirFile.mkdirs();
            //数据库文件是否创建成功
            boolean isFileCreateSuccess = false;
            //判断文件是否存在,不存在则创建该文件
            File dbFile = new File(dbPath);
            if(!dbFile.exists()){
                try {
                    isFileCreateSuccess = dbFile.createNewFile();//创建文件
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            else
                isFileCreateSuccess = true;
            //返回数据库文件对象
            if(isFileCreateSuccess)
                return dbFile;
            else
                return null;
            }
       }

      @Override
      public SQLiteDatabase openOrCreateDatabase(String name, int mode,
                                               SQLiteDatabase.CursorFactory factory) {
           SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null);
           return result;
       }
   
      @Override
      public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory,
                                               DatabaseErrorHandler errorHandler) {
            SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null);
           return result;
         }
}

最后,别忘了改变数据库创建时传入的Context,如下:
        DatabaseContext databaseContext = new DatabaseContext(this);
        helper = new DaoMaster.DevOpenHelper(databaseContext, "scyl.db", null);
        db = helper.getWritableDatabase();
        daoMaster = new DaoMaster(db);
        daoSession = daoMaster.newSession();
一般的数据库的初始化建议放在Application中。到此数据库存储路径已经改变成指定的路径下。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝店铺跳失率过大怎么办 国外打印很贵怎么办 店铺访客被拒怎么办 steam锁支付后怎么办 芦荟茎太长了怎么办 网店加盟被骗怎么办 分期乐忘记账号怎么办 贴墙纸遇到插头怎么办 用了屈臣氏过敏怎么办 商品房内电箱不符合标准怎么办 淘宝上恶意退货怎么办 退货率高了怎么办 淘宝店被关了钱怎么办 买家不申请退款怎么办 被买家恶意投诉怎么办 淘宝投诉后退款怎么办 天猫投诉不成功怎么办 苹果手机打不开流量怎么办 苹果6流量打不开怎么办 苹果笔记本电脑打不开软件怎么办 苹果软件蜂窝打不开怎么办 苹果手机wifi打不开怎么办 苹果app变成韩语怎么办 ipad键盘变成英文怎么办 苹果8商店打不开怎么办 苹果手机不能下载怎么办 天猫魔盒遥控器丢了怎么办 电视盒子声音小怎么办 宽带los亮红灯怎么办 猫的lan灯不亮怎么办 光猫los灯不亮怎么办 移动宽带红灯亮怎么办 ie打不开网页怎么办win10 win10系统ie打不开怎么办 笔记本电脑玩lol卡怎么办 火狐浏览器电脑版打不开怎么办 手机淘宝没密码怎么办 实体店不让退货怎么办 出生公证双认证怎么办 手机淘宝网速慢怎么办 淘宝开店认证不通过怎么办