Android使用sqlliteOpenhelper更改数据库的存储路径放到SD卡上

如果使用默认的系统管理,默认放在包下面,比较省心,,而且在卸载app后不会造成数据残留,但是这样也有一个问题,比如我做一个背单词的软件,那么当用户卸载掉这个app时,他辛辛苦苦下载的单词库也没了…

所以我想到的解决方案,就是把数据库路径改下,不放到包下面,放到SD卡上。仔细看看,还真不容易做,网上有人甚至去更改源码。不过最后还是找到了解决方案:

查看SQLiteOpenHelper源码,会发现有这样一段代码:

if (mName == null) {db = SQLiteDatabase.create(null);} else {db = mContext.openOrCreateDatabase(mName, 0, mFactory);}可以看到,当mName非空的时候,由mContext进行完成创建和打开。而这个mContext可以通过构造函数传入。

看下sqlliteOpenhelper这个实现类:

package cn.com.xx.xx.util;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;/** * DataBase helper class * @author howlaa * @date 2015-1-5 14:38:28 */public class DBOpenHelper extends SQLiteOpenHelper {private static final String DBNAME = "test.db";private static final int VERSION = 11;public DBOpenHelper(Context context) { super(context, DBNAME, null, VERSION);//it's location is data/data/pakage/database}@Overridepublic void onCreate(SQLiteDatabase db) {//It will be called when the database was created firstdb.execSQL("CREATE TABLE IF NOT EXISTS exam_type (id integer primary key autoincrement, type_name varchar(100), type_id INTEGER)");}@Override // It'll be called when the database was updatedpublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}}剩下的就要完成这个mContext的实现了:package cn.com.smartcost.scexam.util;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;/** * 用于支持对存储在SD卡上的数据库的访问**/public class DatabaseContext extends ContextWrapper {/*** 构造函数* @param base 上下文环境*/public DatabaseContext(Context base){super(base);}/*** 获得数据库路径,如果不存在,则创建对象对象* @param name* @param mode* @param factory*/@Overridepublic 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().toString();dbDir += "/scexam";//数据库所在目录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 blocke.printStackTrace();}}elseisFileCreateSuccess = true;//返回数据库文件对象if(isFileCreateSuccess)return dbFile;elsereturn null;}}/*** 重载这个方法,是用来打开SD卡上的数据库的,android 2.3及以下会调用这个方法。** @param name* @param mode* @param factory*/@Overridepublic 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* @paramerrorHandler*/@Overridepublic 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);最后不要忘记,加上读写SD卡的权限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

版权声明:本文为博主原创文章,未经博主允许不得转载。

为了一些琐事吵架,然后冷战,疯狂思念对方,最后和好。

Android使用sqlliteOpenhelper更改数据库的存储路径放到SD卡上

相关文章:

你感兴趣的文章:

标签云: