Android 數據庫打包隨APK發布

openkk 12年前發布 | 50K 次閱讀 Android Android開發 移動開發

有些時候我們的軟件用到SQLite數據庫,這個時候怎么把一個做好的數據庫打包進我們的APK呢,其實很簡單,就是把我們的數據庫文件放到我們的手機里,所以不必局限在哪個地方寫這個代碼,在第一次創建數據庫的時候可以,我覺得在軟件起動頁里效果更好一點,首先我們應該把事先寫好的數據庫文件比如 test.db放到res文件夾里的raw文件夾里,也可以放到assets里,因為這兩個文件夾不會在生成APK的時候不會被壓縮

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import com.android.qufu.dinner.MealActivityGroup; import com.android.qufu.dinner.R;

import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ActivityInfo; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.Window; import android.view.WindowManager; import android.widget.ImageView; import android.widget.TextView;

public class Loggin extends Activity { public static String dbName="dinner.db";//數據庫的名字 private static String DATABASE_PATH="/data/data/com.android.qufu.dinner/databases/";//數據庫在手機里的路徑 int alpha = 255; int b = 0;

 public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.login); 
        //判斷數據庫是否存在
        boolean dbExist = checkDataBase();
        if(dbExist){

        }else{//不存在就把raw里的數據庫寫入手機
            try{
                copyDataBase();
            }catch(IOException e){
                throw new Error("Error copying database");
            }
        }

        new Thread(new Runnable() { 
            public void run() { 
                initApp(); //初始化程序 

                while (b < 2) { 
                    try { 
                        if (b == 0) { 
                            Thread.sleep(20); 
                            b = 1; 
                        } else { 
                            Thread.sleep(50); 
                        } 
                        updateApp(); 
                    } catch (InterruptedException e) { 
                        e.printStackTrace(); 
                    } 
                } 
            } 
        }).start(); 


    } 

    public void updateApp() { 
        alpha -= 5; 
        if (alpha <= 0) { 
            b = 2; 
            if(true){
            try{
               Intent in = new Intent(Loggin.this,MealActivityGroup.class); 
               Loggin.this.startActivity(in); 
               Loggin.this.finish();
            }catch(Exception e){

                }
            }

        } 

    } 
    /**
     * 判斷數據庫是否存在
     * @return false or true
     */
    public boolean checkDataBase(){
        SQLiteDatabase checkDB = null;
        try{
            String databaseFilename = DATABASE_PATH+dbName;
            checkDB =SQLiteDatabase.openDatabase(databaseFilename, null,
                    SQLiteDatabase.OPEN_READONLY);
        }catch(SQLiteException e){

        }
        if(checkDB!=null){
            checkDB.close();
        }
        return checkDB !=null?true:false;
    }
    /**
     * 復制數據庫到手機指定文件夾下
     * @throws IOException
     */
    public void copyDataBase() throws IOException{
        String databaseFilenames =DATABASE_PATH+dbName;
        File dir = new File(DATABASE_PATH);
        if(!dir.exists())//判斷文件夾是否存在,不存在就新建一個
            dir.mkdir();
        FileOutputStream os = null;
        try{
            os = new FileOutputStream(databaseFilenames);//得到數據庫文件的寫入流
        }catch(FileNotFoundException e){
            e.printStackTrace();
        }
        InputStream is = Loggin.this.getResources().openRawResource(R.raw.test);//得到數據庫文件的數據流
        byte[] buffer = new byte[8192];
        int count = 0;
        try{

            while((count=is.read(buffer))>0){
                os.write(buffer, 0, count);
                os.flush();
            }
        }catch(IOException e){

        }
        try{
            is.close();
            os.close();
        }catch(IOException e){
            e.printStackTrace();
        }
    }
    /**
     * 初始化,這里是起始頁的沒有用
     */
    public void initApp(){          
    } 
} </pre>
 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!