淺入淺出Android(010):如何將已有的sqlite數據庫放入程序中

建數據庫

首先,創建sqlite數據庫appdata.db,在其中建表填數據:
CREATE TABLE user (
name  TEXT
);

INSERT INTO user VALUES ('letian');
INSERT INTO user VALUES ('xiaoming');



創建Android項目

這個項目使用了eclipse + ADT + Genymotion。
使用eclipse創建android項目,將appdata.db文件複製到項目的 /assets目錄下。

修改佈局文件/res/layout/activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

	    <Button
	        android:id="@+id/btn"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:text="獲取數據庫內容" />

</LinearLayout>



修改Java文件/src/com/example/initsqlite/MainActivity.java

package com.example.initsqlite;



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

import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
	
	String DB_PATH = "/data" + Environment.getDataDirectory().getAbsolutePath()
            + "/com.example.initsqlite/databases/";
	String DB_NAME = "appdata.db";
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		Button btn = (Button) findViewById(R.id.btn);
		
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            	 getSqliteContent();
            }
        });

	}
	
	/**
	 * 獲取數據庫信息
	 */
	public void getSqliteContent(){

		
		File f = new File(DB_PATH + DB_NAME);
		if (!f.exists()) {
			prepareDB();
		}
		 Toast.makeText(MainActivity.this, "獲取數據庫內容", Toast.LENGTH_SHORT).show();
		SQLiteDatabase db = openOrCreateDatabase(DB_PATH+DB_NAME, Context.MODE_PRIVATE, null);
        Cursor c = db.rawQuery("SELECT NAME FROM user", new String[]{});  
        String result = "";
        while (c.moveToNext()) {  
            String name = c.getString(c.getColumnIndex("name"));  
            result = result  +  name + "\n";
        } 
        Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
	}

	/**
	 * 準備數據庫
	 */
	public void prepareDB() {
		if ((new File(DB_PATH+DB_NAME)).exists() == false) {
			
			Toast.makeText(MainActivity.this, "檢查到沒有數據庫,準備數據庫ing", Toast.LENGTH_SHORT).show();
			
			// 如 SQLite 數據庫文件不存在,再檢查一下 database 目錄是否存在
			File f = new File(DB_PATH);
			// 如 database 目錄不存在,新建該目錄
			if (!f.exists()) {
				f.mkdir();
			}

			try {
				// 獲得 assets 目錄下咱們實現準備好的 SQLite 數據庫做爲輸入流
				InputStream is = 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();
				Toast.makeText(MainActivity.this, "數據庫已經準備好啦", Toast.LENGTH_SHORT).show();
			} catch (Exception e) {
				e.printStackTrace();
			}
		} else {
			Toast.makeText(MainActivity.this, "數據庫已經存在", Toast.LENGTH_SHORT).show();
		}
	}

}




程序分析

運行程序,效果圖以下:


打開DDMS(Window->Open Perspective->DDMS),選中「File Explorer」選項卡,依次進入目錄 /data/data/com.example.initsqlite,等待觀察其變化。

第一次點擊「獲取數據庫內容「這個按鈕時,程序會依次經過Toast依次顯示: html

檢查到沒有數據庫,準備數據庫ing



數據庫已經準備好啦



獲取數據庫內容



letian
xiaoming



最後依次顯示的是user表中的內容。
在DDMS下,能夠看到 /data/data/com.example.initsqlite目錄內容變爲:

在第二次點擊「獲取數據庫內容「這個按鈕時,程序會依次經過Toast依次顯示:
獲取數據庫內容
letian
xiaoming

代碼分析

appdata.db會被編譯到apk文件之中,處理sqlite的一個經常使用方法是使用 openOrCreateDatabase()函數,不過這個函數須要數據庫的路徑做爲參數,而apk中的sqlite文件沒法表示成路徑的形式,因此能夠經過將sqlite文件複製到文件系統中解決讀sqlite文件的問題。把sqlite文件複製到什麼地方視需求而定。

先看函數prepareDB()。先檢查指定路徑下是否存在這個數據庫文件,若是不存在的話,首先判斷是否應該建立目錄,當目錄存在時,將數據庫文件appdata.db複製到這個目錄中。

再函數getSqliteContent()。這個函數首先準備數據庫(prepareDB(),這段代碼有冗餘,寫得很差),在準備好數據後,從數據庫從提取信息,並通過Toast顯示之。

參考

本文部分代碼參考自:http://www.cnblogs.com/yingql/archive/2011/12/12/2284841.html 下面的這篇博客講解了如何操做sqlite:http://blog.csdn.net/liuhe688/article/details/6715983
相關文章
相關標籤/搜索