基于Android如何实现将数据库保存到SD卡

2019-12-10 19:41:24王振洲

通过上面的分析可以写出一个自定义的Context类,该类继承Context即可,但由于Context中有除了openOrCreateDatabase方法以外的其它抽象函数,所以建议使用非抽象类ContextWrapper,该类继承自Context,自定义的DatabaseContext类源码如下:

public class DatabaseContext extends ContextWrapper {
 public DatabaseContext(Context context){
  super( context );
 }
 /**
  * 获得数据库路径,如果不存在,则创建对象对象
  * @param name
  * @param mode
  * @param factory
  */
 @Override
 public File getDatabasePath(String name) {
  //判断是否存在sd卡
  boolean sdExist = android.os.Environment.MEDIA_MOUNTED.equals(android.os.Environment.getExternalStorageState());
  if(!sdExist){//如果不存在,
   return null;
  }else{//如果存在
   //获取sd卡路径
   String dbDir= FileUtils.getFlashBPath();
   dbDir += "DB";//数据库所在目录
   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;
   }
  }
 }
 /**
  * 重载这个方法,是用来打开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), null);
  return result;
 }
 /**
  * Android 4.0会调用此方法获取数据库。
  * 
  * @see android.content.ContextWrapper#openOrCreateDatabase(java.lang.String, int, 
  *   android.database.sqlite.SQLiteDatabase.CursorFactory,
  *   android.database.DatabaseErrorHandler)
  * @param name
  * @param mode
  * @param factory
  * @param errorHandler
  */
 @Override
 public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory, DatabaseErrorHandler errorHandler) {
  SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null);
  return result;
 }
}

在继承SQLiteOpenHelper的子类的构造函数中,用DatabaseContext的实例替代context即可: