因为这次的项目需要自带数据,所以就就把数据都放到一个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";//forLogCatprivatestaticStringdatabasepath="/data/data/%s/database";//%sispackageName//AmappingfromassetsdatabasefiletoSQLiteDatabaseobjectprivateMap<String,SQLiteDatabase>databases=newHashMap<String,SQLiteDatabase>();//ContextofapplicationprivateContextcontext=null;//SingletonPatternprivatestaticAssetsDatabaseManagermInstance=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,iftruemeansthisdatabasefilewascopiedandvalidif(!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');");

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

本文转自:http://www.xuebuyuan.com/1236770.html

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. Assets 与 Res android的两大资源的获取 与android studio中asse
  3. android集成Umeng推送获取不到device_token也收不到消息,但是在Um
  4. Android获取usb上的U盘存储路径
  5. Android登录状态记录
  6. Android实时获取音量(单位:分贝)
  7. 007:快图产品体验报告-Android【猎豹】
  8. Android之Windows下生成动态库so并打包到APK中
  9. Android-如何稳定获取IMEI1、IMEI2、MEID,以及获取其他设备ID闲谈

随机推荐

  1. Android学习路线总结
  2. 新的 Android(安卓)恶意软件“命中” 62
  3. Android网络电台的一种实现方案
  4. android环境传感器
  5. Android(安卓)MVC 模式的介绍 与 实战
  6. Android(安卓)TV Launcher 桌面导航
  7. 一个功能有点变态的android Toast工具 可
  8. Android之异步任务加载网络数据
  9. Android:剖析源码,随心所欲控制Toast显示
  10. Android中程序向桌面和Launcher添加快捷