android:Android中用文件初始化sqlite数据库(zz)
生活随笔
收集整理的這篇文章主要介紹了
android:Android中用文件初始化sqlite数据库(zz)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ??很多時候在應用安裝初始化時,需要創建本地數據庫,同時為數據庫添加數據,之后再從數據庫中讀取數據。
CREATE?TABLE?"android_metadata"?("_id"??INTEGER?PRIMARY?KEY?AUTOINCREMENT,"locale"?TEXT?DEFAULT?'en_US');//創建表?? INSERT?INTO?"android_metadata"?VALUES?(1,'en_US');//插入值?? public?class?DataBaseHelper?extends?SQLiteOpenHelper?{?? ????//The?Android's?default?system?path?of?your?application?database.?? ????private?static?String?DB_PATH?=?"/data/data/YOUR_PACKAGE/databases/";?? ????private?static?String?DB_NAME?=?"myDBName";?? ????private?SQLiteDatabase?myDataBase;?? ????private?final?Context?myContext;?? ????/**? ?????*?Constructor? ?????*?Takes?and?keeps?a?reference?of?the?passed?context?in?order?to?access?to?the?application?assets?and?resources.? ?????*?@param?context? ?????*/?? ????public?DataBaseHelper(Context?context)?{?? ????????super(context,?DB_NAME,?null,?1);?? ????????this.myContext?=?context;?? ????}?? ?? ????/**? ?????*?Creates?a?empty?database?on?the?system?and?rewrites?it?with?your?own?database.? ?????*?*/?? ????public?void?createDataBase()throws?IOException?{?? ????????boolean?dbExist?=?checkDataBase();?? ????????if?(dbExist)?{?? ????????????//do?nothing?-?database?already?exist?? ????????}?else?{?? ????????????//By?calling?this?method?and?empty?database?will?be?created?into?the?default?system?path?? ????????????//of?your?application?so?we?are?gonna?be?able?to?overwrite?that?database?with?our?database.?? ????????????this.getReadableDatabase();?? ????????????try?{?? ????????????????copyDataBase();?? ????????????}?catch?(IOException?e)?{?? ????????????????throw?new?Error("Error?copying?database");?? ????????????}?? ????????}?? ????}?? ?? ????/**? ?????*?Check?if?the?database?already?exist?to?avoid?re-copying?the?file?each?time?you?open?the?application.? ?????*?@return?true?if?it?exists,?false?if?it?doesn't? ?????*/?? ????private?boolean?checkDataBase()?{?? ????????SQLiteDatabase?checkDB?=?null;?? ????????try?{?? ????????????String?myPath?=?DB_PATH?+?DB_NAME;?? ????????????checkDB?=?SQLiteDatabase.openDatabase(myPath,?null,?SQLiteDatabase.OPEN_READONLY);?? ????????}?catch?(SQLiteException?e)?{?? ????????????//database?does't?exist?yet.?? ????????}?? ?? ????????if?(checkDB?!=?null)?{?? ????????????checkDB.close();?? ????????}?? ????????return?checkDB?!=?null???true?:?false;?? ????}?? ?? ????/**? ?????*?Copies?your?database?from?your?local?assets-folder?to?the?just?created?empty?database?in?the? ?????*?system?folder,?from?where?it?can?be?accessed?and?handled.? ?????*?This?is?done?by?transfering?bytestream.? ?????*?*/?? ????private?void?copyDataBase()throws?IOException?{?? ????????//Open?your?local?db?as?the?input?stream?? ????????InputStream?myInput?=?myContext.getAssets().open(DB_NAME);?? ????????//?Path?to?the?just?created?empty?db?? ????????String?outFileName?=?DB_PATH?+?DB_NAME;?? ????????//Open?the?empty?db?as?the?output?stream?? ????????OutputStream?myOutput?=?new?FileOutputStream(outFileName);?? ????????//transfer?bytes?from?the?inputfile?to?the?outputfile?? ????????byte[]buffer?=?new?byte[1024];?? ????????int?length;?? ????????while?((length?=?myInput.read(buffer))?>?0)?{?? ????????????myOutput.write(buffer,?0,?length);?? ????????}?? ?? ????????//Close?the?streams?? ????????myOutput.flush();?? ????????myOutput.close();?? ????????myInput.close();?? ????}?? ?? ????public?void?openDataBase()throws?SQLException?{?? ????????//Open?the?database?? ????????String?myPath?=?DB_PATH?+?DB_NAME;?? ????????myDataBase?=?SQLiteDatabase.openDatabase(myPath,?null,?SQLiteDatabase.OPEN_READONLY);?? ????}?? ?? ????@Override?? ????public?synchronized?void?close()?{?? ????????if?(myDataBase?!=?null)?? ????????????myDataBase.close();?? ????????super.close();?? ????}?? ?? ????@Override?? ????public?void?onCreate(SQLiteDatabase?db)?{}?? ?? ????@Override?? ????public?void?onUpgrade(SQLiteDatabase?db,?int?oldVersion,?int?newVersion)?{}?? ????//?Add?your?public?helper?methods?to?access?and?get?content?from?the?database.?? ????//?You?could?return?cursors?by?doing?"return?myDataBase.query(....)"?so?it'd?be?easy?? ????//?to?you?to?create?adapters?for?your?views.?? }?? ...?? DataBaseHelper?myDbHelper?=?new?DataBaseHelper();?? myDbHelper?=?new?DataBaseHelper(this);?? try?{?? ????myDbHelper.createDataBase();?? }?catch?(IOException?ioe)?{?? ????throw?new?Error("Unable?to?create?database");?? }?? try?{?? ????myDbHelper.openDataBase();?? }?catch?(SQLException?sqle)?{?? ????throw?sqle;?? }?? ... ?
來源:?http://zhangfan822.iteye.com/blog/1883829
這里有2個思路
? ??1.先在本地創建一個能支持android使用的sqlite數據庫文件,啟動時,用現成的sqlite的二進制文件進行直接copy到Android系統的數據庫路徑
? ??2.可以考慮在第一次啟動時,執行數據庫初始化的sql文件.
?
1.在本地準備android能使用的sqlite數據庫文件
使用sqlite數據庫管理工具,看個人愛好(SQLite Database Browser?,Navicat Premium,)
打開數據庫,創建"android_metadata"數據表
Sql代碼???創建其他應用需要的表..此處省略.
?
2.復制文件到應用中.
把第一步創建的數據庫文件復制到應用中的assets文件夾, asserts文件夾的路徑如下:
然后創建DateBaseHelper extends?SQLiteOpenHelper的類文件.
代碼如下:
Java代碼???
3.現在我們可以創建DateBaseHelper的實現操作了.
createDataBase()?//創建
openDataBase()//打開只讀數據庫
記得要更改"YOUR_PACKAGE"為你的應用的包名
如:com.examplename.myapp
大概代碼如下:
Java代碼??來源:?http://zhangfan822.iteye.com/blog/1883829
轉載于:https://www.cnblogs.com/strinkbug/p/6858702.html
總結
以上是生活随笔為你收集整理的android:Android中用文件初始化sqlite数据库(zz)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js 根据固定位置获取经纬度--腾讯地图
- 下一篇: Android setBackgroun