因为这次的项目需要自带数据,所以就就把数据都放到一个SQLite的数据库文件中了,之后把该文件放到了assets文件夹下面。一开始打算每次都从assets文件夹下面把该文件夹拷贝到手机的SD卡或者手机自身的存储上之后再使用,后来考虑到每次都拷贝的话效率不高,并且如果涉及到对数据库的修改操作的话拷贝之后数据就被恢复了。

因此就写了该封装,该封装只是在第一次使用数据库文件的时候把该文件夹拷贝到手机的/data/data/应用程序报名/database文件夹下,之后就直接从这个地方使用了。并且它允许你直接通过assets文件夹下的数据库名称来获取SQLiteDatabase对象,这样就极大的方便了你对数据库的使用。

  1. package com.jemsn.database;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.InputStream;
  5. import java.io.OutputStream;
  6. import java.util.HashMap;
  7. import java.util.Map;
  8. import android.content.Context;
  9. import android.content.SharedPreferences;
  10. import android.content.res.AssetManager;
  11. import android.database.sqlite.SQLiteDatabase;
  12. import android.util.Log;
  13. /**
  14. * This is a Assets Database Manager
  15. * Use it, you can use a assets database file in you application
  16. * It will copy the database file to "/data/data/[your application package name]/database" when you first time you use it
  17. * Then you can get a SQLiteDatabase object by the assets database file
  18. * @author RobinTang
  19. * @time 2012-09-20
  20. *
  21. *
  22. * How to use:
  23. * 1. Initialize AssetsDatabaseManager
  24. * 2. Get AssetsDatabaseManager
  25. * 3. Get a SQLiteDatabase object through database file
  26. * 4. Use this database object
  27. *
  28. * Using example:
  29. * AssetsDatabaseManager.initManager(getApplication()); // this method is only need call one time
  30. * AssetsDatabaseManager mg = AssetsDatabaseManager.getManager();   // get a AssetsDatabaseManager object
  31. * SQLiteDatabase db1 = mg.getDatabase("db1.db");   // get SQLiteDatabase object, db1.db is a file in assets folder
  32. * db1.???  // every operate by you want
  33. * Of cause, you can use AssetsDatabaseManager.getManager().getDatabase("xx") to get a database when you need use a database
  34. */
  35. public class AssetsDatabaseManager {
  36. private static String tag = "AssetsDatabase"; // for LogCat
  37. private static String databasepath = "/data/data/%s/database"; // %s is packageName
  38. // A mapping from assets database file to SQLiteDatabase object
  39. private Map<String, SQLiteDatabase> databases = new HashMap<String, SQLiteDatabase>();
  40. // Context of application
  41. private Context context = null;
  42. // Singleton Pattern
  43. private static AssetsDatabaseManager mInstance = null;
  44. /**
  45. * Initialize AssetsDatabaseManager
  46. * @param context, context of application
  47. */
  48. public static void initManager(Context context){
  49. if(mInstance == null){
  50. mInstance = new AssetsDatabaseManager(context);
  51. }
  52. }
  53. /**
  54. * Get a AssetsDatabaseManager object
  55. * @return, if success return a AssetsDatabaseManager object, else return null
  56. */
  57. public static AssetsDatabaseManager getManager(){
  58. return mInstance;
  59. }
  60. private AssetsDatabaseManager(Context context){
  61. this.context = context;
  62. }
  63. /**
  64. * Get a assets database, if this database is opened this method is only return a copy of the opened database
  65. * @param dbfile, the assets file which will be opened for a database
  66. * @return, if success it return a SQLiteDatabase object else return null
  67. */
  68. public SQLiteDatabase getDatabase(String dbfile) {
  69. if(databases.get(dbfile) != null){
  70. Log.i(tag, String.format("Return a database copy of %s", dbfile));
  71. return (SQLiteDatabase) databases.get(dbfile);
  72. }
  73. if(context==null)
  74. return null;
  75. Log.i(tag, String.format("Create database %s", dbfile));
  76. String spath = getDatabaseFilepath();
  77. String sfile = getDatabaseFile(dbfile);
  78. File file = new File(sfile);
  79. SharedPreferences dbs = context.getSharedPreferences(AssetsDatabaseManager.class.toString(), 0);
  80. boolean flag = dbs.getBoolean(dbfile, false); // Get Database file flag, if true means this database file was copied and valid
  81. if(!flag || !file.exists()){
  82. file = new File(spath);
  83. if(!file.exists() && !file.mkdirs()){
  84. Log.i(tag, "Create \""+spath+"\" fail!");
  85. return null;
  86. }
  87. if(!copyAssetsToFilesystem(dbfile, sfile)){
  88. Log.i(tag, String.format("Copy %s to %s fail!", dbfile, sfile));
  89. return null;
  90. }
  91. dbs.edit().putBoolean(dbfile, true).commit();
  92. }
  93. SQLiteDatabase db = SQLiteDatabase.openDatabase(sfile, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
  94. if(db != null){
  95. databases.put(dbfile, db);
  96. }
  97. return db;
  98. }
  99. private String getDatabaseFilepath(){
  100. return String.format(databasepath, context.getApplicationInfo().packageName);
  101. }
  102. private String getDatabaseFile(String dbfile){
  103. return getDatabaseFilepath()+"/"+dbfile;
  104. }
  105. private boolean copyAssetsToFilesystem(String assetsSrc, String des){
  106. Log.i(tag, "Copy "+assetsSrc+" to "+des);
  107. InputStream istream = null;
  108. OutputStream ostream = null;
  109. try{
  110. AssetManager am = context.getAssets();
  111. istream = am.open(assetsSrc);
  112. ostream = new FileOutputStream(des);
  113. byte[] buffer = new byte[1024];
  114. int length;
  115. while ((length = istream.read(buffer))>0){
  116. ostream.write(buffer, 0, length);
  117. }
  118. istream.close();
  119. ostream.close();
  120. }
  121. catch(Exception e){
  122. e.printStackTrace();
  123. try{
  124. if(istream!=null)
  125. istream.close();
  126. if(ostream!=null)
  127. ostream.close();
  128. }
  129. catch(Exception ee){
  130. ee.printStackTrace();
  131. }
  132. return false;
  133. }
  134. return true;
  135. }
  136. /**
  137. * Close assets database
  138. * @param dbfile, the assets file which will be closed soon
  139. * @return, the status of this operating
  140. */
  141. public boolean closeDatabase(String dbfile){
  142. if(databases.get(dbfile) != null){
  143. SQLiteDatabase db = (SQLiteDatabase) databases.get(dbfile);
  144. db.close();
  145. databases.remove(dbfile);
  146. return true;
  147. }
  148. return false;
  149. }
  150. /**
  151. * Close all assets database
  152. */
  153. static public void closeAllDatabase(){
  154. Log.i(tag, "closeAllDatabase");
  155. if(mInstance != null){
  156. for(int i=0; i<mInstance.databases.size(); ++i){
  157. if(mInstance.databases.get(i)!=null){
  158. mInstance.databases.get(i).close();
  159. }
  160. }
  161. mInstance.databases.clear();
  162. }
  163. }
  164. }

使用的过程也很简单,应用程序开始的时候初始化一下,之后就可以在任意地方获取管理器在通过assets文件夹下的数据库文件名直接获取SQLiteDatabase对象,之后对数据库的操作就完全看你了。。。

简单的使用例子:

  1. // 初始化,只需要调用一次
  2. AssetsDatabaseManager.initManager(getApplication());
  3. // 获取管理对象,因为数据库需要通过管理对象才能够获取
  4. AssetsDatabaseManager mg = AssetsDatabaseManager.getManager();
  5. // 通过管理对象获取数据库
  6. SQLiteDatabase db1 = mg.getDatabase("db1.db");
  7. // 对数据库进行操作
  8. db1.execSQL("insert into tb([ID],[content]) values(null, 'db1');");

需要注意的是获取数据库对象的时候是区分数据库文件名的大小写的。

Android 使用存放在存assets文件夹下的SQLite数据库的更多相关文章

  1. 42、使用存放在存assets文件夹下的SQLite数据库

    因为这次的项目需要自带数据,所以就就把数据都放到一个SQLite的数据库文件中了,之后把该文件放到了assets文件夹下面.一开始打算每次都从assets文件夹下面把该文件夹拷贝到手机的SD卡或者手机 ...

  2. Android开发系列(十七):读取assets文件夹下的数据库文件

    在做Android应用的时候,不可避免要用到数据库.可是当我们把应用的apk部署到真机上的时候,已经创建好的数据库及其里边的数据是不能随着apk一起安装到真机上的. (PS:这篇博客攻克了我前面博客中 ...

  3. 读取assets文件夹下图片(ods_interview)

    今天看了一道题,现在总结一下里面使用到的知识点: 1.assets文件的访问: 原文出处:http://blog.csdn.net/fengyuzhengfan/article/details/383 ...

  4. Android程序函数 将assets文件夹下的文件复制到手机的sd卡中(包括子文件夹)

    最近在做个功能是将asset文件夹下的所有文件(包括子文件)全部拷贝出来到指定目录下.所用的方法无非是用AssetManager.但是这里 有个问题是也要讲子文件夹和子文件都要拷贝出来.到网上Goog ...

  5. Android开发:第四日番外——Assets文件夹和RAW文件夹区别

    话说上回说到SQLite数据库,其中涉及到把已经设计好的数据库打包到APK中,提到可以放置在Assert文件夹或者RAW文件夹中,那么两者到底有什么区别呢?让我们来探究一下. 一.res/raw和as ...

  6. android assets文件夹浅谈

    ---恢复内容开始--- 最近在研究assets文件夹的一些属性跟使用方法.根据网上一些文章.实例做一下汇总,拿出来跟大家分享下,有不足的地方还请多多指教. 首先了解一下assets是干什么用的,as ...

  7. Android编程心得-在Assets文件夹中放入.sql文件实现创建SQlite表的操作

    当我们在使用SQLiteOpenHelper时,经常使用db.execSQL(String sql)方法写入对应语句实现创建表的操作,这样的确可以实现业务逻辑.与此同时还有一种更灵活的方法,从asse ...

  8. Unity 需不需要再建Assets文件夹

    不需要,默认所有文件都是在Assets文件夹下创建的,看不到是因为设置了单栏模式,开启双栏模式就能看到了.

  9. Android assets文件夹之位置放置和作用

    Android 的assets文件夹的放置位置,Eclipse创建项目时就生成了的,Android Studio则不太一样,AS可以包含几种方式, 1:可以在build.gradle文件下配置,加如下 ...

随机推荐

  1. 1、Spring概述

    Java EE优缺点 我们都知道在2003年Spring兴起之前,企业普遍使用J2EE技术来开发企业级应用,为什么用J2EE呢?主要原因有以下几个: 1.Java本身的跨平台能力,可移植性强2.J2E ...

  2. bootcss

    道友们,今天由贫道讲一下bootcss的编码规范: 首先黄金定律:一个项目一定要有一套编码规范,无伦项目有多少人参与都要一致. 用两个空格来代替制表符(tab) -- 这是唯一能保证在所有环境下获得一 ...

  3. jquery 固定导航

    网页代码: <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> & ...

  4. hdu 1072 广搜

    路径是可以重复走的,但是如果再一次走过时间重置点是没有意义的 #include <iostream> #include <cstdio> #include <cstrin ...

  5. Debian上安装java

    Debian 8 Jessie上安装命令: echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main&qu ...

  6. MySQL(3)-索引

    一.索引类型 在MySQL中,存储引擎使用索引,首先在索引中找到对应值,然后根据匹配的索引记录中找到对应的行. 无论是多么复杂的ORM工具,在精妙和复杂的索引面前都是"浮云".这里 ...

  7. Ambari中添加新服务

    官网: https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=38571133 一.背景 栈的定义可以在源代码树中找到/am ...

  8. wuzhi 五指 基本知识

    参数:m 模块 在于  /coreframe/app/模块文件夹 |默认 content f  php文件 控制器  在于/coreframe/app/模块 /文件.php | 默认 index v ...

  9. ios书籍推荐

    1.Objective-C Programming  内容不多, 却都是精华, 有了一点 C 语言基础可以快速阅读此书, 大概一天时间就可以看完, 看完后对 iOS 开发能够有个基本的印象. 2.iO ...

  10. knockout.js-创建视图模型

    监控属性(Observables) knockout的三个核心特点: 1.监控属性与依赖跟踪 2.声明式绑定 3.模板 本页,你将学习上述三个特性.但是在这之前,先了解一下MVVC模式,及 视图模型( ...