SQLite

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

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

  1. if (mName == null) {
  2. db = SQLiteDatabase.create(null);
  3. }
  4. else {
  5. db = mContext.openOrCreateDatabase(mName, 0, mFactory);
  6. }

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

重载Context

  1. import java.io.File;
  2. import java.io.IOException;
  3. import android.content.Context;
  4. import android.content.ContextWrapper;
  5. import android.database.DatabaseErrorHandler;
  6. import android.database.sqlite.SQLiteDatabase;
  7. import android.database.sqlite.SQLiteDatabase.CursorFactory;
  8. import android.util.Log;
  9. public class DatabaseContext extends ContextWrapper {
  10. public DatabaseContext(Context base){
  11. super(base);
  12. }
  13. /**
  14. * 获得数据库路径,如果不存在,则创建对象对象
  15. * @param name
  16. * @param mode
  17. * @param factory
  18. */
  19. @Override
  20. public File getDatabasePath(String name) {
  21. //判断是否存在sd卡
  22. boolean sdExist = android.os.Environment.MEDIA_MOUNTED.equals(android.os.Environment.getExternalStorageState());
  23. if(!sdExist){//如果不存在,
  24. Log.e("SD卡管理:", "SD卡不存在,请加载SD卡");
  25. return null;
  26. }
  27. else{//如果存在
  28. //获取sd卡路径
  29. String dbDir=android.os.Environment.getExternalStorageDirectory().getAbsolutePath();
  30. dbDir += "/database";//数据库所在目录
  31. String dbPath = dbDir+"/"+name;//数据库路径
  32. //判断目录是否存在,不存在则创建该目录
  33. File dirFile = new File(dbDir);
  34. if(!dirFile.exists())
  35. dirFile.mkdirs();
  36. //数据库文件是否创建成功
  37. boolean isFileCreateSuccess = false;
  38. //判断文件是否存在,不存在则创建该文件
  39. File dbFile = new File(dbPath);
  40. if(!dbFile.exists()){
  41. try {
  42. isFileCreateSuccess = dbFile.createNewFile();//创建文件
  43. } catch (IOException e) {
  44. // TODO Auto-generated catch block
  45. e.printStackTrace();
  46. }
  47. }
  48. else
  49. isFileCreateSuccess = true;
  50. //返回数据库文件对象
  51. if(isFileCreateSuccess)
  52. return dbFile;
  53. else
  54. return null;
  55. }
  56. }
  57. /**
  58. * 重载这个方法,是用来打开SD卡上的数据库的,android 2.3及以下会调用这个方法。
  59. *
  60. * @param name
  61. * @param mode
  62. * @param factory
  63. */
  64. @Override
  65. public SQLiteDatabase openOrCreateDatabase(String name, int mode,
  66. SQLiteDatabase.CursorFactory factory) {
  67. SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null);
  68. return result;
  69. }
  70. /**
  71. * Android 4.0会调用此方法获取数据库。
  72. *
  73. * @see android.content.ContextWrapper#openOrCreateDatabase(java.lang.String, int,
  74. * android.database.sqlite.SQLiteDatabase.CursorFactory,
  75. * android.database.DatabaseErrorHandler)
  76. * @param name
  77. * @param mode
  78. * @param factory
  79. * @param errorHandler
  80. */
  81. @Override
  82. public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory,
  83. DatabaseErrorHandler errorHandler) {
  84. SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null);
  85. return result;
  86. }
  87. }

调用:

  1. DatabaseContext dbContext = new DatabaseContext(this);
  2. SdCardDBHelper dbHelper = new SdCardDBHelper(dbContext);

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

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

权限:

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

我是天王盖地虎的分割线

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

Android -- 创建数据库到SD卡的更多相关文章

  1. android复制数据库到SD卡(网上搜集,未经验证)

    android中使用sqlite.复制assets下的数据库到SD卡.支持大于1M的文件 如果使用SD卡,需要在AndroidManifest.xml中设置权限 <uses-permission ...

  2. Android入门开发之SD卡读写操作(转)

    SD卡的读写是我们在开发android 应用程序过程中最常见的操作.下面介绍SD卡的读写操作方式: 1. 获取SD卡的根目录 String  sdCardRoot = Environment.getE ...

  3. 安卓模拟器创建和使用SD卡的方法

    安卓模拟器创建和使用SD卡的方法: 创建一个SD卡镜像文件 打开cmd,进入Android SDK安装路径下的tools目录下,输入如下命令:mksdcard 1024M sdcard.img 该命令 ...

  4. Android数据存储之SD卡

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

  5. android 写文件到sd卡问题小记

    android 写文件到sd卡问题小记 事情是这样子的.... 这天我开始编写项目调试工具,高大上不?-----其实就是记录实时网络请求和崩溃日志相关等的小工具(此处一个会心的微笑). 然后我是这样写 ...

  6. [android] 保存文件到SD卡

    /****************2016年5月4日 更新*****************************/ 知乎:为什么很多Android应用要把文件写到/sdcard目录下而不是写到/d ...

  7. Android中播放本地SD卡中歌曲须要的加入的权限

    使用MediaPlayer播放本地Mp3文件时.须要注意的訪问路径的问题以及訪问权限的问题. 1.訪问路径:/storage/emulated/0 此路径即为手机的根路径,能够通过下载ES文件浏览器软 ...

  8. Android之外部存储(SD卡)

    *手机的外部存储空间,这个我们可以理解成电脑的外接移动硬盘,U盘也行.所有的Android设备都有两个文件存储区域:“内部”和“外部”存储器.这两个名称来自早期的Android,当时大多数设备都提供内 ...

  9. 转 Android:文件下载和写入SD卡学习小结

    转自 http://blog.csdn.net/zzp_403184692/article/details/8160739  一.文件下载  Android开发中,有时需要从网上下载一些资源以供用户使 ...

随机推荐

  1. 用nginx-gridFS读取MongoDB的图片及文件(为什么你老是配不成功?)

    最近在部署公司服务器的nginx + mongodb + gridfs环境: 搜索了N多文档,基本上都一样,期间遇到很多问题: 下面是整理的一份搭建文档: 摘要 nginx-gridfs是一个ngin ...

  2. Effective Java 29 Consider typesafe heterogeneous containers

    When a class literal is passed among methods to communicate both compile-time and runtime type infor ...

  3. Effective Java 48 Avoid float and double if exact answers are required

    Reason The float and double types are particularly ill-suited for monetary calculations because it i ...

  4. Tomcat报java.lang.ClassNotFoundException: 1catalina.org.apache.juli.FileHandler

    最近在生产环境部署Tomcat的时候,在启动的时候,在控制台报"java.lang.ClassNotFoundException: 1catalina.org.apache.juli.Fil ...

  5. jquery eq 用法

    <html> <head> <script src='jquery.min.js'></script> <script type="te ...

  6. 进制,原码VS补码

    进制 十,八,十六进制=>二进制 十进制=>二进制:辗转相除取余,10除2商5余0,5除2商2余1,2除2商1余0,1除2商0余1,So,10d=1010b 八进制=>二进制:每1位 ...

  7. Warning:mailcious javascript detected on this domain来由

    http://www.thenewslens.com/post/144232/ 这是原文介绍,可能国内要用网络加速器才能查看. 以下是国外的一些文档介绍:Cyberspace Administrati ...

  8. LessonFifth Redis的持久化功能

    #验证redis的快照和AOF功能 1.先验证RDB快照功能,由于AOF优先级高,先关闭,然后测试,截图如下                 2.设置打开AOF 然后进行实验,截图如下:       ...

  9. FDTD Python API

    源代码 #!/usr/bin/env python from math import exp from gnuplot_leon import * imp0 = 377.0 class fdtd_le ...

  10. [转]关于负margin在页面中布局的应用

    本文转载自:http://www.cnblogs.com/jscode/archive/2012/08/28/2660078.html. 今天再写一个布局的时候用到一个margin-top是负值的情况 ...