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

目前android中比较热门的数据库框架有greenDAO、OrmLite、AndrORM,其中我比较喜欢用GreenDao,其运行效率最高,内存消耗最少,性能最佳。具体怎么使用GreenDao,网上随便搜搜都会有很多资料介绍。不过最近,在我的项目我需要改变数据库的存储位置,而android默认是在/data/data/Package Name/database创建数据库文件,

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

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

public static abstract classOpenHelper extends SQLiteOpenHelper {publicOpenHelper(Context context, String name, CursorFactory factory) {

super(context, name, factory, SCHEMA_VERSION);

}

@Overridepublic voidonCreate(SQLiteDatabase db) {

Log.i("greenDAO", "Creating tables for schema version" +SCHEMA_VERSION);

createAllTables(db,false);

}

}public static classDevOpenHelper extends OpenHelper {publicDevOpenHelper(Context context, String name, CursorFactory factory) {

super(context, name, factory);

}

@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, intnewVersion) {

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 classDatabaseContext extends ContextWrapper {public DatabaseContext(Context base) {

super(base);

}/**

* 获得数据库路径,如果不存在,则自动创建*/@OverridepublicFile 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 = newFile(dbDir);if(!dirFile.exists())

dirFile.mkdirs();//数据库文件是否创建成功

boolean isFileCreateSuccess = false;//判断文件是否存在,不存在则创建该文件

File dbFile = newFile(dbPath);if(!dbFile.exists()){try{

isFileCreateSuccess= dbFile.createNewFile();//创建文件

} catch(IOException e) {

e.printStackTrace();

}

}elseisFileCreateSuccess= true;//返回数据库文件对象

if(isFileCreateSuccess)returndbFile;else

return null;

}

}

@Overridepublic SQLiteDatabase openOrCreateDatabase(String name, intmode,

SQLiteDatabase.CursorFactory factory) {

SQLiteDatabase result= SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null);returnresult;

}

@Overridepublic SQLiteDatabase openOrCreateDatabase(String name, intmode, SQLiteDatabase.CursorFactory factory,

DatabaseErrorHandler errorHandler) {

SQLiteDatabase result= SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null);returnresult;

}

}

最后,别忘了改变数据库创建时传入的Context,如下:

DatabaseContext databaseContext = new DatabaseContext(this);

helper= new DaoMaster.DevOpenHelper(databaseContext, "scyl.db", null);

db=helper.getWritableDatabase();

daoMaster= newDaoMaster(db);

daoSession= daoMaster.newSession();

一般的数据库的初始化建议放在Application中。到此数据库存储路径已经改变成指定的路径下。

原文:https://www.cnblogs.com/zhujiabin/p/9105380.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值