因为这次的项目需要自带数据,所以就就把数据都放到一个SQLite的数据库文件中了,之后把该文件放到了assets文件夹下面。一开始打算每次都从assets文件夹下面把该文件夹拷贝到手机的SD卡或者手机自身的存储上之后再使用,后来考虑到每次都拷贝的话效率不高,并且如果涉及到对数据库的修改操作的话拷贝之后数据就被恢复了。
因此就写了该封装,该封装只是在第一次使用数据库文件的时候把该文件夹拷贝到手机的/data/data/应用程序报名/database文件夹下,之后就直接从这个地方使用了。并且它允许你直接通过assets文件夹下的数据库名称来获取SQLiteDatabase对象,这样就极大的方便了你对数据库的使用。
- package com.jemsn.database;
-
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.util.HashMap;
- import java.util.Map;
-
- import android.content.Context;
- import android.content.SharedPreferences;
- import android.content.res.AssetManager;
- import android.database.sqlite.SQLiteDatabase;
- import android.util.Log;
-
- public class AssetsDatabaseManager {
- private static String tag = "AssetsDatabase";
- private static String databasepath = "/data/data/%s/database";
-
-
-
- private Map<String, SQLiteDatabase> databases = new HashMap<String, SQLiteDatabase>();
-
-
- private Context context = null;
-
-
- private static AssetsDatabaseManager mInstance = null;
-
-
- public static void initManager(Context context){
- if(mInstance == null){
- mInstance = new AssetsDatabaseManager(context);
- }
- }
-
-
- public static AssetsDatabaseManager getManager(){
- return mInstance;
- }
-
- private AssetsDatabaseManager(Context context){
- this.context = context;
- }
-
-
- public SQLiteDatabase getDatabase(String dbfile) {
- if(databases.get(dbfile) != null){
- Log.i(tag, String.format("Return a database copy of %s", dbfile));
- return (SQLiteDatabase) databases.get(dbfile);
- }
- if(context==null)
- return null;
-
- Log.i(tag, String.format("Create database %s", dbfile));
- String spath = getDatabaseFilepath();
- String sfile = getDatabaseFile(dbfile);
-
- File file = new File(sfile);
- SharedPreferences dbs = context.getSharedPreferences(AssetsDatabaseManager.class.toString(), 0);
- boolean flag = dbs.getBoolean(dbfile, false);
- if(!flag || !file.exists()){
- file = new File(spath);
- if(!file.exists() && !file.mkdirs()){
- Log.i(tag, "Create \""+spath+"\" fail!");
- return null;
- }
- if(!copyAssetsToFilesystem(dbfile, sfile)){
- Log.i(tag, String.format("Copy %s to %s fail!", dbfile, sfile));
- return null;
- }
-
- dbs.edit().putBoolean(dbfile, true).commit();
- }
-
- SQLiteDatabase db = SQLiteDatabase.openDatabase(sfile, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
- if(db != null){
- databases.put(dbfile, db);
- }
- return db;
- }
-
- private String getDatabaseFilepath(){
- return String.format(databasepath, context.getApplicationInfo().packageName);
- }
-
- private String getDatabaseFile(String dbfile){
- return getDatabaseFilepath()+"/"+dbfile;
- }
-
- private boolean copyAssetsToFilesystem(String assetsSrc, String des){
- Log.i(tag, "Copy "+assetsSrc+" to "+des);
- InputStream istream = null;
- OutputStream ostream = null;
- try{
- AssetManager am = context.getAssets();
- istream = am.open(assetsSrc);
- ostream = new FileOutputStream(des);
- byte[] buffer = new byte[1024];
- int length;
- while ((length = istream.read(buffer))>0){
- ostream.write(buffer, 0, length);
- }
- istream.close();
- ostream.close();
- }
- catch(Exception e){
- e.printStackTrace();
- try{
- if(istream!=null)
- istream.close();
- if(ostream!=null)
- ostream.close();
- }
- catch(Exception ee){
- ee.printStackTrace();
- }
- return false;
- }
- return true;
- }
-
-
- public boolean closeDatabase(String dbfile){
- if(databases.get(dbfile) != null){
- SQLiteDatabase db = (SQLiteDatabase) databases.get(dbfile);
- db.close();
- databases.remove(dbfile);
- return true;
- }
- return false;
- }
-
-
- static public void closeAllDatabase(){
- Log.i(tag, "closeAllDatabase");
- if(mInstance != null){
- for(int i=0; i<mInstance.databases.size(); ++i){
- if(mInstance.databases.get(i)!=null){
- mInstance.databases.get(i).close();
- }
- }
- mInstance.databases.clear();
- }
- }
- }
使用的过程也很简单,应用程序开始的时候初始化一下,之后就可以在任意地方获取管理器在通过assets文件夹下的数据库文件名直接获取SQLiteDatabase对象,之后对数据库的操作就完全看你了。。。
简单的使用例子:
- AssetsDatabaseManager.initManager(getApplication());
- AssetsDatabaseManager mg = AssetsDatabaseManager.getManager();
- SQLiteDatabase db1 = mg.getDatabase("db1.db");
- db1.execSQL("insert into tb([ID],[content]) values(null, ‘db1‘);");
需要注意的是获取数据库对象的时候是区分数据库文件名的大小写的。
Android 使用存放在存assets文件夹下的SQLite数据库
原文:http://www.cnblogs.com/qingchen1984/p/4988674.html