greenDAO資料庫之修改儲存地址

weixin_33866037發表於2018-05-20

傳送門-->索引
一、DaoMaster.DevOpenHelper
在建立 DaoMaster.DevOpenHelper例項的時候如果第一個引數傳的是app的context,那麼資料庫的儲存地址和應用是在同一個包下。

DaoMaster.DevOpenHelper mHelper = new DaoMaster.DevOpenHelper(context, DB_NAME, null);

二、修改context
如果想要修改db的位置,就必須修改這個context,程式碼如下;-)

DaoMaster.DevOpenHelper = = new DaoMaster.DevOpenHelper(new DaoManager.GreenDaoContext(context), DB_NAME, null);
  public static class GreenDaoContext  extends ContextWrapper {

        private String currentUserId = "greendao";//一般用來針對一個使用者一個資料庫,以免資料混亂問題
        private Context mContext;

        public GreenDaoContext(Context context) {
            super(context);
            this.mContext = context;
        }

        /**
         * 獲得資料庫路徑,如果不存在,則建立物件
         *
         * @param dbName
         */
        @Override
        public File getDatabasePath(String dbName) {
            String dbDir = Environment.getExternalStorageDirectory().getPath();
            if (TextUtils.isEmpty(dbDir)){
                Log.e("SD卡管理:", "SD卡不存在,請載入SD卡");
                return null;
            }
            File baseFile = new File(dbDir);
            // 目錄不存在則自動建立目錄
            if (!baseFile.exists()){
                baseFile.mkdirs();
            }
            StringBuffer buffer = new StringBuffer();
            buffer.append(baseFile.getPath());
            buffer.append(File.separator);
            buffer.append(currentUserId);
            dbDir = buffer.toString();// 資料庫所在目錄
            buffer.append(File.separator);
//        buffer.append(dbName+"_"+currentUserId);//也可以採用此種方式,將使用者id與表名聯絡到一塊命名
            buffer.append(dbName);
            String dbPath = buffer.toString();// 資料庫路徑
            // 判斷目錄是否存在,不存在則建立該目錄
            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 super.getDatabasePath(dbName);
        }

        /**
         * 過載這個方法,是用來開啟SD卡上的資料庫的,android 2.3及以下會呼叫這個方法。
         *
         * @param name
         * @param mode
         * @param factory
         */
        @Override
        public SQLiteDatabase openOrCreateDatabase(String name, int mode,SQLiteDatabase.CursorFactory factory) {
            SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), factory);
            return result;
        }

        /**
         * Android 4.0會呼叫此方法獲取資料庫。
         *
         * @param name
         * @param mode
         * @param factory
         * @param errorHandler
         * @see android.content.ContextWrapper#openOrCreateDatabase(java.lang.String, int,
         * android.database.sqlite.SQLiteDatabase.CursorFactory,
         * android.database.DatabaseErrorHandler)
         */
        @Override
        public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory,DatabaseErrorHandler errorHandler) {
            SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), factory);

            return result;
        }

    }

相關文章