ããå¨æå 个Androidåºç¨ä¸ï¼æéè¦è®¿é®å·²æçæ°æ®åºãè¿äºæ°æ®åºå¾å¾å¾å¤§ï¼çè³è¶
è¿assetæ件大约1å
åèçéå¶ãèä¸å¨æ°ççæ¬ä¸æ°æ®åºéè¦æ´æ°ãæå¨ç½ä¸ï¼ç¹å«æ¯StackOverflowçäºä¸äºæç« ï¼å¹¶åäºä¸äºè¯éªï¼è§å¾ä¸é¢ç代ç è½åºæ¬ä¸æ»¡è¶³æçéæ±ã
ããå
¶ä¸»è¦æè·¯æ¯ï¼
ãã1. ææ°æ®åºå解æå 个assetæ件ã
ãã2. å½éè¦æå¼æ°æ®åºæ¶ï¼å¦ææ°æ®åºä¸åå¨ï¼å°±æé£å 个assetæ件éæ°å并æä¸ä¸ªæ°æ®åºæ件ã
ãã3. å¦ææ°æ®åºççæ¬æ¹åäºï¼å°±å¨onUpgrade()æ¹æ³ä¸ææ°æ®åºæ件å é¤æã
ãã
ããä¸é¢æ¯ä»£ç ï¼
ãã
ãã//æ°æ®åºç缺çè·¯å¾
ããprivate static finalString DB_PATH = "/data/data/com.mypackage.myapp/databases/";
ããprivate static finalString DB_NAME = "mydb.db";
ããprivate static finalint DB_VERSION = 2;
ããprivate static finalString DB_SPLIT_NAME = "mydb.db.00";
ããprivate static finalint DB_SPLIT_COUNT = 3;
ããprivate SQLiteDatabasem_database;
ããprivate final Contextm_context;
ãã/**
ãã* Constructor
ãã*ä¿åä¼ è¿æ¥çcontextåæ°ä»¥ç¨æ¥è®¿é®åºç¨çassetåèµæºæ件ã
ãã* @param context
ãã*/
ããpublic MyDB(Contextcontext) {
ããsuper(context, DB_NAME, null, DB_VERSION);
ããthis.m_context = context;
ãã}
ããpublic static MyDBopenDatabaseReadOnly(Context context) {
ããMyDB db = new MyDB(context);
ãã
ããtry {
ããdb.createDataBase();
ãã} catch (IOException e) {
ãã// TODO Auto-generated catch block
ããe.printStackTrace();
ãã}
ãã
ããdb.openDataBase(SQLiteDatabase.OPEN_READONLY);
ããreturn db;
ãã}
ããpublic static MyDBopenDatabaseReadWrite(Context context) {
ããMyDB db = new MyDB(context);
ãã
ããtry {
ããdb.createDataBase();
ãã} catch (IOException e) {
ãã// TODO Auto-generated catch block
ããe.printStackTrace();
ãã}
ãã
ããdb.openDataBase(SQLiteDatabase.OPEN_READWRITE);
ããreturn db;
ãã}
ãã/**
ãã*å建ä¸ä¸ªç©ºæ°æ®åºï¼ç¨æ¥åå¨ä½ å·²æçæ°æ®åºã
ãã*/
ããpublic voidcreateDataBase() throws IOException{
ããboolean dbExist =checkDataBase();
ããif (dbExist) {
ãã/*
ãã**å¦æä½ çæ°æ®åºççæ¬æ¹åäºï¼è°ç¨è¿ä¸ªæ¹æ³ç¡®ä¿å¨onUpgrade()被è°ç¨æ¶
ãã**ä¼ è¿å»çæ¯å¯åçæ°æ®åºã
ãã*/
ããSQLiteDatabase db =this.getWritableDatabase();
ãã
ããif (db != null) {
ããdb.close();
ãã}
ãã}
ãã
ããdbExist = checkDataBase();
ãã
ããif (!dbExist) {
ããtry {
ãã/*
ãã** è°ç¨è¿ä¸ªæ¹æ³ä»¥ç¡®ä¿å¨ç¼ºçè·¯å¾å
产çä¸ä¸ªç©ºæ°æ®åºï¼ä»¥ä¾¿å¨å
¶åºç¡ä¸å¤å¶æ们已æçæ°æ®åºã
ãã*/
ããSQLiteDatabase db =this.getReadableDatabase();
ãã
ããif (db != null) {
ããdb.close();
ãã}
ããcopyDataBase();
ãã}
ããcatch (IOException e) {
ããLog.e("DB", e.getMessage());
ããthrow new Error("Error copyingdatabase");
ãã}
ãã}
ãã}
ãã/**
ãã* æ£æ¥æ°æ®åºæ¯å¦å·²åå¨ï¼ä»¥é¿å
éå¤å¤å¶ã
ãã* @return true if it exists, false if itdoesn't
ãã*/
ããprivate static booleancheckDataBase(){
ããSQLiteDatabase checkDB = null;
ããtry {
ããString path = DB_PATH + DB_NAME;
ããcheckDB =SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
ãã}
ããcatch (SQLiteException e){
ãã//database does't exist yet.
ãã}
ããif (checkDB != null) {
ããcheckDB.close();
ãã}
ããreturn checkDB != null ? true : false;
ãã}
ãã/**
ãã* æåå¨assetæ件ä¸çæ°æ®åºå¤å¶çåå建ç空æ°æ®åºä¸ã
ãã* */
ããprivate voidcopyDataBase() throws IOException {
ãã// åå建ç空æ°æ®åºçè·¯å¾
ããString outFileName = DB_PATH + DB_NAME;
ãã// æå¼ç©ºæ°æ®åº
ããOutputStream output = new FileOutputStream(outFileName);
ãã
ããbyte[] buffer = new byte[1024*8];
ãã
ããAssetManager assetMgr =m_context.getAssets();
ãã
ããfor (int i = 1; i <= DB_SPLIT_COUNT; i++){
ãã// æå¼å解çassetæ件
ããString fn = DB_SPLIT_NAME +String.valueOf(i);
ããInputStream input = assetMgr.open(fn);
ãã//Log.i("DB", "opened" + fn);
ãã
ããint length;
ããwhile ((length = input.read(buffer)) >0) {
ãã//Log.i("DB", "read" + String.valueOf(length));
ããoutput.write(buffer, 0, length);
ãã//Log.i("DB", "write" + String.valueOf(length));
ãã}
ããinput.close();
ãã}
ãã
ãã//Close the streams
ããoutput.flush();
ããoutput.close();
ãã}
ãã
ãã/**
ãã* æå¼æ°æ®åºã
ãã* */
ããprivate voidopenDataBase(int flags) throws SQLException{
ãã//Open the database
ããString myPath = DB_PATH + DB_NAME;
ããm_database =SQLiteDatabase.openDatabase(myPath, null, flags);
ãã}
ãã
ãã/**
ãã* å
³éæ°æ®åºã
ãã* */
ãã@Override
ããpublic synchronizedvoid close() {
ããif (m_database != null)
ããm_database.close();
ããsuper.close();
ãã}
ãã}
ãã
ãã@Override
ããpublic voidonCreate(SQLiteDatabase db) {
ãã// ä¸éåä»»ä½äº
ãã}
ãã
ãã/**
ãã* å¨æ°æ®åºçæ¬æé«æ¶ï¼å é¤åææ°æ®åºã
ãã* */
ãã@Override
ããpublic voidonUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
ããif (newVersion > oldVersion) {
ããm_context.deleteDatabase(DB_NAME);
ãã}
ãã}
转载
温馨提示:答案为网友推荐,仅供参考