android 数据库目录 SD卡

   Android应用的开发过程中,免不了会用到SQLite数据库,而SQLite数据库默认的存储路径为:/data/data/packagename/database,其中 packagename是应用的包名。该种方式建立的数据库只有本程序可以访问,其他的应用程序是无法访问的,而且没有经过root的手机,用户是无法手动删除该数据库文件的。但是该数据库文件一旦建立,便是常驻于内存的(只有当应用程序被卸载时,才会被删除),如果数据库文件比较大时,建议不要放在内存中,毕竟内存空间是有限的。
    于是就想着把数据库文件建在SDCard上,放在SDCard上的优点是不影响内存,而且就算程序被卸载,再重装时,数据也不会丢失。下面讲讲怎么把数据库建在SDCard上:
    之前也找过很多资料,大致上的意思,就是继承SQLiteOpenHelper类,然后重写其中的getWritableDatabase方法,在里面调用SQLiteDatabase.openOrCreateDatabase(file, null)方法,其中file即是数据库文件在SDCard上的文件名称。这种方法确实可以在SDCard上建立数据库文件,但是问题是如果在查询数据库时,可能不需要写权限,只需要读权限,就需要调用getReadableDatabase方法,所以又必须要重写这个方法。更重要的是,重写的这些方法并不是线程安全的,SQLiteOpenHelper类中的这两个方法在调用时是做了一系列的加锁处理的,重写之后这些代码便不起作用了,容易导致错误,如果全部挪过来的话就太复杂了。
      废话说了一箩筐,终于上正题了。其实查看framework中SQLiteOpenHelper的源码可以发现,在getWritableDatabase中会也是会调用openOrCreateDatabase方法的,其中的file参数值是在该类的构造器中传入的,而在继承SQLiteOpenHelper类时,也是必须要实现构造器的,在构造器中还必须调用父类的构造器,因此,可以在SQLiteOpenHelper子类中传入放在SDCard上的数据库文件(如/sdcard/database/db.db),但是前提是必须要先建立数据库文件的父文件夹(/sdcard/database),否则会抛出异常。具体代码如下:
public class BaseMsgDbHelper extends SQLiteOpenHelper {
      public static final String DB_NAME = "db.db";
      public static final int VERSION = 1;
      public BaseMsgDbHelper(Context context) {
            super(context, getMyDatabaseName(context), null, VERSION);
      }
       private static String getMyDatabaseName(Context context){
            String databasename = DB_NAME;
             boolean isSdcardEnable = false;
             String state = Environment.getExternalStorageState();
             if(Environment.MEDIA_MOUNTED.equals(state)){//SDCard是否插入
                  isSdcardEnable = true;
             }
             String dbPath = null;
             if(isSdcardEnable){
                  dbPath = Environment.getExternalStorageDirect ory().getPath() + "/database/";
             }else{//未插入SDCard,建在内存中
                  dbPath = context.getFilesDir().getPath() + "/database/";
             }
             File dbp = new File(dbPath);
             if(!dbp.exists()){
                  dbp.mkdirs();
             }
             databasename = dbPath + DB_NAME;
             return databasename;
       }
}
仅此而已,其他的调用方法都不受任何影响,是不是很简单方便......

转载于:https://my.oschina.net/u/1585312/blog/997429

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值