转载

Android -- 创建数据库到SD卡

SQLite

系统自带的SQLite是通过SQLiteOpenHelper实现的,而SQLiteOpenHelper是将数据库存储到/data/data/包名/databasas,这样做的话在没有root的手机上是没法看到SQLite数据库的。

所以,换种方式,将数据库SQLite存储到SD卡上。那么跟其中相关联的是 getWritableDatabase 方法。

if (mName == null) {      db = SQLiteDatabase.create(null); }  else {      db = mContext.openOrCreateDatabase(mName, 0, mFactory); }

分析上述代码发现,当数据库名字为非空时,创建数据库或打开由mContext完成,这个mContext由SQLiteOpenHelper的构造函数传入:SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)。那么我们对于传入的context,重载其openOrCreateDatabase函数,使其将数据库创建到SD卡中就可完成我们的目标了。

重载Context

import java.io.File; import java.io.IOException;  import android.content.Context; import android.content.ContextWrapper; import android.database.DatabaseErrorHandler; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.util.Log;  public class DatabaseContext extends ContextWrapper {                             public DatabaseContext(Context base){             super(base);         }               /**          * 获得数据库路径,如果不存在,则创建对象对象          * @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){//如果不存在,                 Log.e("SD卡管理:", "SD卡不存在,请加载SD卡");                 return null;             }              else{//如果存在                 //获取sd卡路径                 String dbDir=android.os.Environment.getExternalStorageDirectory().getAbsolutePath();                 dbDir += "/database";//数据库所在目录                 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) {                         // TODO Auto-generated catch block                         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;         }     } 

调用:

DatabaseContext dbContext = new DatabaseContext(this); SdCardDBHelper dbHelper = new SdCardDBHelper(dbContext);

这里尤其值得注意的是,不同版本的android API会调用不同的openOrCreateDatabase函数。

当然也可直接使用SQLiteDatabase创建SD卡上的数据库,或者直接修改SQLiteOpenHelper的源码重新编译,不过前者没有对数据库进行一些检验容错处理,也不及SQLiteOpenHelper对数据库操作方便。后者工作量较大,不建议采用。

权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

我是天王盖地虎的分割线

http://www.cnblogs.com/esrichina/p/3347036.html

正文到此结束
Loading...