假设使用默认的系统管理,默认放在包以下。比較省心。并且在卸载app后不会造成数据残留。可是这样也有一个问题。比方我做一个背单词的软件,那么当用户卸载掉这个app时,他辛辛苦苦下载的单词库也没了...

所以我想到的解决方式。就是把数据库路径改下。不放到包以下,放到SD卡上。

细致看看。还真不easy做,网上有人甚至去更改源代码。只是最后还是找到了解决方式:

查看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 first db.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();}}else     isFileCreateSuccess = true;//返回数据库文件对象if(isFileCreateSuccess)return dbFile;else return 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* @param     errorHandler*/@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卡上相关推荐

  1. android 5.1.1 sd卡权限,android - 适用于Android 5.1.1及更高版本的Cordova的外部存储路径(SD卡) - 堆栈内存溢出...

    从Android 5.0开始,外部(可移动)SD的位置不再是固定路径. 而是在路径中使用SD卡的序列号. 例如,在运行Android 7.1.1的Samsung Galaxy S4上,物理外部可移动S ...

  2. Unity3D各平台路径(包括手机内置存储路径、SD卡等等)

    关于Unity3D在各平台上的路径问题,网上有好多的资料,如下是比较好的参考资料: 1.http://www.manew.com/thread-23491-1-1.html 2.http://www. ...

  3. android手机存储大小设置在哪里看,Android 最新获取手机内置存储大小,SD卡存储空间大小方法...

    在以前我们都是这样获取的 //Android API18之前:fs.getAvailableBlocks()*fs.getBlockSize() 目前: /** 得到系统可用内存 **/ @Suppr ...

  4. java sql变更存储,MySQL更改数据库数据存储目录,mysql数据存储

    MySQL更改数据库数据存储目录,mysql数据存储 MySQL数据库默认的数据库文件位于 /var/lib/mysql 下,有时候由于存储规划等原因,需要更改 MySQL 数据库的数据存储目录.下文 ...

  5. android studio数据库存储数据,如何使用API​​ 23在android studio中的数据库中存储数据?...

    大多数时候我不会发布任何内容,因为我可以在其他帖子中找到我需要的所有内容,但是现在我已经有几天了,您如何在数据库中存储任何内容?这是我的Java代码如何使用API​​ 23在android studi ...

  6. MYSQL 更改数据库data存储目录 创建用户 创建权限 设置远程访问的权限.

    一. 怎么更改数据库data存储目录:  1. 安装MYSQL. 2. 切换到 C:\Program Files\MySQL\MySQL Server 5.6 3. 新建my.ini. 加入如下配置: ...

  7. android获取内部存储卡里的文件,获取Android内部存储(外部SD卡)和扩展存储卡(TF卡)的路径...

    获取Android内部存储(外部SD卡)和扩展存储卡(TF卡)的路径 获取Android内部存储(外部SD卡)和扩展存储卡(TF卡)的路径 sd卡存储外部存储卡路径外部存储卡外部存储卡路径内置存储卡外 ...

  8. 索尼android sd卡上,索尼的手机默认存储如何设置到SD卡上呢?

    2014-01-18 红米手机联通合约机怎么把软件默认存储到外置sd卡1上 受网友启发,采用以下步骤: 1,下载百度一键ROOT,获取root权限 2,下载RE管理器,进入root fold的etc文 ...

  9. android u盘自动挂载点,Android2.3实现SD卡与U盘自动挂载的方法

    本文实例讲述了Android2.3实现SD卡与U盘自动挂载的方法.分享给大家供大家参考,具体如下: 在 s3c6410平台上移植android2.3 过程中SD卡总是不能自动挂载. 查阅相关资料,知道 ...

最新文章

  1. codeforce843B Interactive LowerBound
  2. koa+mysql+vue+socket.io全栈开发之web api篇
  3. 利用ViewPager+Fragment+actionbar实现可左右滑动的Action Tab
  4. 关于ajax里面嵌套ajax
  5. Redis 基本数据类型 :String、Hash、List、Set、ZSet
  6. css 网页整体缩小_css实现缩放自适应网页--手机web
  7. qt 语言设置乱码_QT中文乱码与国际化支持
  8. 傅里叶分析 [作 者:韩 昊]
  9. 冬瓜哥对时间和空间的理解方式—时空参悟(上)
  10. 嘉兴 机器人仓库 菜鸟_菜鸟在嘉兴推出全新智能仓 在“双11”启用超级机器人仓群...
  11. 设计模式笔记--访问者模式
  12. 每天读论语《论语·学而》02
  13. 课堂笔记(常用软件,网站资源)
  14. html+css+js 实现图片轮播效果
  15. Pandas str列内置方法
  16. libed2k源码导读:(三)网络IO
  17. 初学者入门渗透工程师就业宝典
  18. 可以让人变老的相机_变老相机软件盘点,四款可以让人变老的相机软件
  19. 如何简单形象又有趣地讲解神经网络是什么?(知乎) 说的人很多,理解很充分
  20. UE4 制作十字准心+后坐力

热门文章

  1. SparkRDD内核
  2. Python3模块: hashlib
  3. 国内流行的两大开源.net微信公众平台SDK对比分析
  4. JS设置Cookie,及COOKIE的限制
  5. android实现翻书效果(文本和图片的翻书)
  6. python---之getattr
  7. error: #error This file requires compiler and library support for the ISO C++ 2011 standard.
  8. LeetCode-13.罗马数字转整数
  9. php常考面试题,面试常见的几道PHP面试题
  10. 一行一个链接代码_小白写代码讨女朋友欢心,包教包会