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*/@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().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 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);

这里尤其值得注意的是,不同版本的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

Android -- 创建数据库到SD卡相关推荐

  1. android创建sqlite在sd卡上,在ionic3的sdcard上创建SQLite数据库

    我尝试将native@ionic native/sqlite模块与ionic3结合使用.如果我在默认位置创建一个SQLite数据库,数据库就会被创建. constructor( public sqli ...

  2. Android 性能测试小工具 (cpu,内存,电量,流量数据浮窗显示,信息导入数据库、sd卡)

    [mie haha的博客]转载请注明出处(万分感谢!): https://blog.csdn.net/qq_40315080/article/details/98610748 写一个测试各个app/手 ...

  3. android 无法显示SD卡目录,Android studio无法在SD卡上创建新目录?

    我使用名为scanlibrary的库来扫描照片,然后将它传递给tess-two来执行OCR过程.问题是,在目录"ScanDemoExample"不被创建因此tessdata文件不会 ...

  4. Android模拟器环境下SD卡内容的管理[转]

    Android模拟器环境下SD卡内容的管理 2010-11-30 22:03 by ·风信子·, 2305 阅读, 0 评论, 收藏, 编辑 本文旨在介绍一些Android模拟器下如何对SD卡内容进行 ...

  5. Android数据存储之SD卡

    为了更好的存取应用程序的大文件数据,应用程序需要读. 写SD卡上的文件.SD卡大大扩充手机的存储能力. 操作SD首先要加权限: <!--在SDCard中创建与删除文件权限 --> < ...

  6. Android模拟器环境下SD卡内容的管理

    本文旨在介绍一些Android模拟器下如何对SD卡内容进行管理的基本命令,同时也给大家推荐一个比较实用的工具. 笔者所用的环境:Windows 7 + Android SDK 2.2 1. 创建SD卡 ...

  7. android 自动下一首,Android播播放完SD卡指定文件夹音乐之后,自动播放下一首

    最近做一个项目,需要连续播放音乐,播放完一首歌之后,自动播放完下一首歌.不要重复播放. 代码如下: package com.example.asyncplayer_ex; import java.io ...

  8. 如何在android模拟器中模拟sd卡,如何在Android模拟器中模拟SD卡

    如何在Android模拟器中模拟SD卡 简介 Android允许开发者创建一个SD卡镜像并在启动模拟器加载它, 用于模拟物理设备中的SD卡. 下面将介绍: 1. 如何创建一个SD卡镜像? 2. 如何拷 ...

  9. android存储到sd卡中,android保存文件到SD卡【文件存储】

    sd卡用于保存大文件如视频,音频,大文档等 package cn.itcast.files; import cn.itcast.service.FileService; import android. ...

最新文章

  1. 2013年3月百度之星B题
  2. 后端_Laravel
  3. Python_Mix*OS模块,序列化模块种的json,pickle
  4. python值函数名的使用以及闭包,迭代器详解
  5. epoll背后的原理
  6. Linux系统编程---13(线程控制函数,创建线程,循环创建多个线程,线程间共享全局变量)
  7. 马里兰大学calce电池循环测试数据集_千次循环,全程1.5V恒压,紫米新一代充电锂电池套装上手体验...
  8. mysql mha reference_MySQL MHA配置常见问题
  9. C#:XML操作类--转
  10. 带你了解常见的编码表,以及他们自己的关系.
  11. 新版“大伦敦规划”中的交通发展策略
  12. SQLserver分离数据库
  13. android 市场 历史版本,安卓市场旧版本
  14. windows10 C盘满了,怎么处理
  15. 使用Spark读取并分析二进制文件
  16. 红旗linux做成u盘,红旗linux下如何用u盘
  17. javaSE_中文转拼音
  18. 免校准的电量计量芯片_电量计量芯片HLW8110的前端电路设计与误差分析校正
  19. 苏宁易购与海信深化战略合作 海信贾少谦:支持苏宁易购新发展
  20. grpc断路器之sentinel

热门文章

  1. ef1a启动子_启动子的选择和预测
  2. 财务管理系统属于计算机应用领域中的,计算机基础套题及其答案.doc
  3. day2 编码与基本数据类型转换
  4. 网页贴便签, Chrome特色网页便签纸 OurStickys
  5. 从python入门到放弃_Python从入门到放弃?方法不对一切白费
  6. 什么是user agent(用户代理)
  7. 商协社团汕头发展-全国工商联·万祥军:企业家论坛研究转型
  8. 【甘肃银行:进一步加大在区块链等领域的布局】GBCAX
  9. 如何使用2FA秘钥登录Facebook
  10. System.gc()的理解