[轉(zhuǎn)]一個(gè)實(shí)用的工具類 - 如何拿到android assets文件夾下的數(shù)據(jù)庫并操作該數(shù)據(jù)庫

??該封裝只是在第一次使用數(shù)據(jù)庫文件的時(shí)候把該文件夾拷貝到手機(jī)的/data/data/應(yīng)用程序報(bào)名/database文件夾下,之后就直接從這個(gè)地方使用了。并且它允許你直接通過assets文件夾下的數(shù)據(jù)庫名稱來獲取SQLiteDatabase對(duì)象,這樣就極大的方便了你對(duì)數(shù)據(jù)庫的使用。

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;

/**
 * This is a Assets Database Manager
 * Use it, you can use a assets database file in you application
 * It will copy the database file to "/data/data/[your application package name]/database" when you first time you use it
 * Then you can get a SQLiteDatabase object by the assets database file 
 * @author RobinTang
 * @time 2012-09-20
 * 
 * 
 * How to use:
 * 1. Initialize AssetsDatabaseManager
 * 2. Get AssetsDatabaseManager
 * 3. Get a SQLiteDatabase object through database file
 * 4. Use this database object
 * 
 * Using example:
 * AssetsDatabaseManager.initManager(getApplication()); // this method is only need call one time
 * AssetsDatabaseManager mg = AssetsDatabaseManager.getManager();   // get a AssetsDatabaseManager object
 * SQLiteDatabase db1 = mg.getDatabase("db1.db");   // get SQLiteDatabase object, db1.db is a file in assets folder
 * db1.???  // every operate by you want
 * Of cause, you can use AssetsDatabaseManager.getManager().getDatabase("xx") to get a database when you need use a database
 */
public class AssetsDatabaseManager {
    private static String tag = "AssetsDatabase"; // for LogCat
    private static String databasepath = "/data/data/%s/database"; // %s is packageName
    
    
    // A mapping from assets database file to SQLiteDatabase object
    private Map<String, SQLiteDatabase> databases = new HashMap<String, SQLiteDatabase>();
    
    // Context of application
    private Context context = null;
    
    // Singleton Pattern
    private static AssetsDatabaseManager mInstance = null;
    
    /**
     * Initialize AssetsDatabaseManager
     * @param context, context of application
     */
    public static void initManager(Context context){
        if(mInstance == null){
            mInstance = new AssetsDatabaseManager(context);
        }
    }
    
    /**
     * Get a AssetsDatabaseManager object
     * @return, if success return a AssetsDatabaseManager object, else return null
     */
    public static AssetsDatabaseManager getManager(){
        return mInstance;
    }
    
    private AssetsDatabaseManager(Context context){
        this.context = context;
    }
    
    /**
     * Get a assets database, if this database is opened this method is only return a copy of the opened database
     * @param dbfile, the assets file which will be opened for a database
     * @return, if success it return a SQLiteDatabase object else return null
     */
    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); // Get Database file flag, if true means this database file was copied and valid
        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;
    }
    
    /**
     * Close assets database
     * @param dbfile, the assets file which will be closed soon
     * @return, the status of this operating
     */
    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;
    }
    
    /**
     * Close all assets database
     */
    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();
        }
    }
}

使用的過程也很簡單,應(yīng)用程序開始的時(shí)候初始化一下,之后就可以在任意地方獲取管理器在通過assets文件夾下的數(shù)據(jù)庫文件名直接獲取SQLiteDatabase對(duì)象,之后對(duì)數(shù)據(jù)庫的操作就完全看你了。。。
簡單的使用例子:

 
// 初始化,只需要調(diào)用一次 在HomeApplication中調(diào)用
AssetsDatabaseManager.initManager(getApplication());
// 獲取管理對(duì)象,因?yàn)閿?shù)據(jù)庫需要通過管理對(duì)象才能夠獲取
AssetsDatabaseManager mg = AssetsDatabaseManager.getManager();
// 通過管理對(duì)象獲取數(shù)據(jù)庫
SQLiteDatabase db1 = mg.getDatabase("db1.db");
// 對(duì)數(shù)據(jù)庫進(jìn)行操作
db1.execSQL("insert into tb([ID],[content]) values(null, 'db1');");

參考文章:
Android 使用存放在存assets文件夾下的SQLite數(shù)據(jù)庫

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評(píng)論 19 139
  • GET和POST是HTTP請(qǐng)求的兩種基本方法,要說它們的區(qū)別,接觸過WEB開發(fā)的人都能說出一二。 然而這個(gè)答案并不...
    邵志遠(yuǎn)閱讀 1,170評(píng)論 0 0
  • 冬日的暖陽,終于兔子不用拔蘿卜,熊不用捕魚了,那場約好的遲來的電影終于可以兌現(xiàn)了。 初見熊·那淘氣的細(xì)胞就在活躍,...
    碧貓閱讀 235評(píng)論 0 1
  • 坐下來算算賬,一天中究極花了多少時(shí)間在手機(jī)里。 算之前我估摸大概兩小時(shí),實(shí)際一算,頓時(shí)心疼起時(shí)間來了,何止兩個(gè)小時(shí)...
    心甲閱讀 253評(píng)論 1 0
  • 春節(jié)前一天一個(gè)偶然的機(jī)會(huì),我在“喜馬拉雅fm”與“時(shí)間管理”不期而遇!并利用假期參加了“春節(jié)閱讀不放假,陪...
    輝煌騰達(dá)的灰閱讀 1,090評(píng)論 2 2

友情鏈接更多精彩內(nèi)容