Android 開發中,如何將 SQLite 和 APK 一起打包發布


最近一時心血來潮,嘗試開發 Android 程序,練習的項目是個簡單的天氣預報程序。其中天氣預報自然要涉及全國各地各個地區,我把這些地區名以及地區代碼放在一個 SQLite 數據庫里,當然 Android 對 SQLite 也支持的很好。問題是,學習過程中發現很多教程或者示例,都是程序運行后即時創建一個數據庫,然后建表、插入數據什么的,而我自己的想法是在電腦上把數據庫事先准備好,然后隨 APK 一起打包發布,否則在 Java 代碼里面 hard code 幾千條 insert 語句,顯然是很傻瓜的行為。經過多方網絡搜尋,終於找到比較完善的解決方法。

在 Eclipse 里新建好工程后,默認會有一個 assets 目錄,在 Eclipse 中直接將准備好的 SQLite 數據庫復制到該目錄中,然后在主 Activity 里面編碼:

package com.test.db;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;

import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;

public class DbtestActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // com.test.db 是程序的包名,請根據自己的程序調整
        // /data/data/com.test.db/
        // databases 目錄是准備放 SQLite 數據庫的地方,也是 Android 程序默認的數據庫存儲目錄
        // 數據庫名為 test.db
        String DB_PATH = "/data/data/com.test.db/databases/";
        String DB_NAME = "test.db";

        // 檢查 SQLite 數據庫文件是否存在
        if ((new File(DB_PATH + DB_NAME)).exists() == false) {
            // 如 SQLite 數據庫文件不存在,再檢查一下 database 目錄是否存在
            File f = new File(DB_PATH);
            // 如 database 目錄不存在,新建該目錄
            if (!f.exists()) {
                f.mkdir();
            }

            try {
                // 得到 assets 目錄下我們實現准備好的 SQLite 數據庫作為輸入流
                InputStream is = getBaseContext().getAssets().open(DB_NAME);
                // 輸出流
                OutputStream os = new FileOutputStream(DB_PATH + DB_NAME);

                // 文件寫入
                byte[] buffer = new byte[1024];
                int length;
                while ((length = is.read(buffer)) > 0) {
                    os.write(buffer, 0, length);
                }

                // 關閉文件流
                os.flush();
                os.close();
                is.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        // 下面測試 /data/data/com.test.db/databases/ 下的數據庫是否能正常工作
        SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(DB_PATH + DB_NAME, null);
        Cursor cursor = database.rawQuery("select * from test", null);

        if (cursor.getCount() > 0) {
            cursor.moveToFirst();
            try {
                // 解決中文亂碼問題
                byte test[] = cursor.getBlob(0);
                String strtest = new String(test, "utf-8").trim();

                // 看輸出的信息是否正確
                System.out.println(strtest);
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        cursor.close();
    }
}

出處:http://www.akasuna.com/2012/03/09/embed-sqlite-database-in-the-apk-of-android-distributed-application/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM