Android操作存放在assets文件夹下SQLite数据库的方法
本文实例讲述了Android操作存放在assets文件夹下SQLite数据库的方法。分享给大家供大家参考。具体如下:
因为这次的项目需要自带数据,所以就就把数据都放到一个SQLite的数据库文件中了,之后把该文件放到了assets文件夹下面。一开始打算每次都从assets文件夹下面把该文件夹拷贝到手机的SD卡或者手机自身的存储上之后再使用,后来考虑到每次都拷贝的话效率不高,并且如果涉及到对数据库的修改操作的话拷贝之后数据就被恢复了。
因此就写了该封装,该封装只是在第一次使用数据库文件的时候把该文件夹拷贝到手机的/data/data/应用程序报名/database文件夹下,之后就直接从这个地方使用了。并且它允许你直接通过assets文件夹下的数据库名称来获取SQLiteDatabase对象,这样就极大的方便了你对数据库的使用。
封装如下:
packagecom.sin.android.database;
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.util.HashMap;
importjava.util.Map;
importandroid.content.Context;
importandroid.content.SharedPreferences;
importandroid.content.res.AssetManager;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.util.Log;
/**
*ThisisaAssetsDatabaseManager
*Useit,youcanuseaassetsdatabasefileinyouapplication
*Itwillcopythedatabasefileto"/data/data/[yourapplicationpackagename]/database"whenyoufirsttimeyouuseit
*ThenyoucangetaSQLiteDatabaseobjectbytheassetsdatabasefile
*@authorRobinTang
*@time2012-09-20
*
*
*Howtouse:
*1.InitializeAssetsDatabaseManager
*2.GetAssetsDatabaseManager
*3.GetaSQLiteDatabaseobjectthroughdatabasefile
*4.Usethisdatabaseobject
*
*Usingexample:
*AssetsDatabaseManager.initManager(getApplication());//thismethodisonlyneedcallonetime
*AssetsDatabaseManagermg=AssetsDatabaseManager.getManager();//getaAssetsDatabaseManagerobject
*SQLiteDatabasedb1=mg.getDatabase("db1.db");//getSQLiteDatabaseobject,db1.dbisafileinassetsfolder
*db1.???//everyoperatebyyouwant
*Ofcause,youcanuseAssetsDatabaseManager.getManager().getDatabase("xx")togetadatabasewhenyouneeduseadatabase
*/
publicclassAssetsDatabaseManager{
privatestaticStringtag="AssetsDatabase";//forLogCat
privatestaticStringdatabasepath="/data/data/%s/database";//%sispackageName
//AmappingfromassetsdatabasefiletoSQLiteDatabaseobject
privateMap<String,SQLiteDatabase>databases=newHashMap<String,SQLiteDatabase>();
//Contextofapplication
privateContextcontext=null;
//SingletonPattern
privatestaticAssetsDatabaseManagermInstance=null;
/**
*InitializeAssetsDatabaseManager
*@paramcontext,contextofapplication
*/
publicstaticvoidinitManager(Contextcontext){
if(mInstance==null){
mInstance=newAssetsDatabaseManager(context);
}
}
/**
*GetaAssetsDatabaseManagerobject
*@return,ifsuccessreturnaAssetsDatabaseManagerobject,elsereturnnull
*/
publicstaticAssetsDatabaseManagergetManager(){
returnmInstance;
}
privateAssetsDatabaseManager(Contextcontext){
this.context=context;
}
/**
*Getaassetsdatabase,ifthisdatabaseisopenedthismethodisonlyreturnacopyoftheopeneddatabase
*@paramdbfile,theassetsfilewhichwillbeopenedforadatabase
*@return,ifsuccessitreturnaSQLiteDatabaseobjectelsereturnnull
*/
publicSQLiteDatabasegetDatabase(Stringdbfile){
if(databases.get(dbfile)!=null){
Log.i(tag,String.format("Returnadatabasecopyof%s",dbfile));
return(SQLiteDatabase)databases.get(dbfile);
}
if(context==null)
returnnull;
Log.i(tag,String.format("Createdatabase%s",dbfile));
Stringspath=getDatabaseFilepath();
Stringsfile=getDatabaseFile(dbfile);
Filefile=newFile(sfile);
SharedPreferencesdbs=context.getSharedPreferences(AssetsDatabaseManager.class.toString(),0);
booleanflag=dbs.getBoolean(dbfile,false);//GetDatabasefileflag,iftruemeansthisdatabasefilewascopiedandvalid
if(!flag||!file.exists()){
file=newFile(spath);
if(!file.exists()&&!file.mkdirs()){
Log.i(tag,"Create\""+spath+"\"fail!");
returnnull;
}
if(!copyAssetsToFilesystem(dbfile,sfile)){
Log.i(tag,String.format("Copy%sto%sfail!",dbfile,sfile));
returnnull;
}
dbs.edit().putBoolean(dbfile,true).commit();
}
SQLiteDatabasedb=SQLiteDatabase.openDatabase(sfile,null,SQLiteDatabase.NO_LOCALIZED_COLLATORS);
if(db!=null){
databases.put(dbfile,db);
}
returndb;
}
privateStringgetDatabaseFilepath(){
returnString.format(databasepath,context.getApplicationInfo().packageName);
}
privateStringgetDatabaseFile(Stringdbfile){
returngetDatabaseFilepath()+"/"+dbfile;
}
privatebooleancopyAssetsToFilesystem(StringassetsSrc,Stringdes){
Log.i(tag,"Copy"+assetsSrc+"to"+des);
InputStreamistream=null;
OutputStreamostream=null;
try{
AssetManageram=context.getAssets();
istream=am.open(assetsSrc);
ostream=newFileOutputStream(des);
byte[]buffer=newbyte[1024];
intlength;
while((length=istream.read(buffer))>0){
ostream.write(buffer,0,length);
}
istream.close();
ostream.close();
}
catch(Exceptione){
e.printStackTrace();
try{
if(istream!=null)
istream.close();
if(ostream!=null)
ostream.close();
}
catch(Exceptionee){
ee.printStackTrace();
}
returnfalse;
}
returntrue;
}
/**
*Closeassetsdatabase
*@paramdbfile,theassetsfilewhichwillbeclosedsoon
*@return,thestatusofthisoperating
*/
publicbooleancloseDatabase(Stringdbfile){
if(databases.get(dbfile)!=null){
SQLiteDatabasedb=(SQLiteDatabase)databases.get(dbfile);
db.close();
databases.remove(dbfile);
returntrue;
}
returnfalse;
}
/**
*Closeallassetsdatabase
*/
staticpublicvoidcloseAllDatabase(){
Log.i(tag,"closeAllDatabase");
if(mInstance!=null){
for(inti=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());
//获取管理对象,因为数据库需要通过管理对象才能够获取
AssetsDatabaseManagermg=AssetsDatabaseManager.getManager();
//通过管理对象获取数据库
SQLiteDatabasedb1=mg.getDatabase("db1.db");
//对数据库进行操作
db1.execSQL("insertintotb([ID],[content])values(null,'db1');");
需要注意的是获取数据库对象的时候是区分数据库文件名的大小写的。
希望本文所述对大家的Android程序设计有所帮助。