android: SQLite建立數據庫

SQLite 是一款輕量級的關係型數據庫,它的運算速度很是快, 佔用資源不多,一般只須要幾百 K 的內存就足夠了,於是特別適合在移動設備上使用。SQLite 不只支持標準的 SQL 語法,還遵循了數據庫的 ACID 事務,因此只要你之前使用過其餘的 關係型數據庫,就能夠很快地上手 SQLite。而 SQLite 又比通常的數據庫要簡單得多,它甚 至不用設置用戶名和密碼就可使用。Android 正是把這個功能極爲強大的數據庫嵌入到了 系統當中,使得本地持久化的功能有了一次質的飛躍。android

前面咱們所學的文件存儲和 SharedPreferences 存儲畢竟只適用於去保存一些簡單的數據 和鍵值對,當須要存儲大量複雜的關係型數據的時候,你就會發現以上兩種存儲方式很難應 付得了。好比咱們手機的短信程序中可能會有不少個會話,每一個會話中又包含了不少條信息 內容,而且大部分會話還可能各自對應了電話簿中的某個聯繫人。很難想象如何用文件或者 SharedPreferences 來存儲這些數據量大、結構性複雜的數據吧?可是使用數據庫就能夠作得 到。那麼咱們就趕快來看一看,Android 中的 SQLite 數據庫究竟是如何使用的。sql

建立數據庫shell

Android 爲了讓咱們可以更加方便地管理數據庫,專門提供了一個 SQLiteOpenHelper 幫 助類,藉助這個類就能夠很是簡單地對數據庫進行建立和升級。既然有好東西能夠直接使用, 那咱們天然要嘗試一下了,下面我就將對 SQLiteOpenHelper 的基本用法進行介紹。數據庫

首先你要知道 SQLiteOpenHelper 是一個抽象類,這意味着若是咱們想要使用它的話, 就須要建立一個本身的幫助類去繼承它。SQLiteOpenHelper 中有兩個抽象方法,分別是 onCreate()和 onUpgrade(),咱們必須在本身的幫助類裏面重寫這兩個方法,而後分別在這兩 個方法中去實現建立、升級數據庫的邏輯。bash

SQLiteOpenHelper 中 還 有 兩 個 非 常 重 要 的 實 例 方 法 , getReadableDatabase() 和 getWritableDatabase()。這兩個方法均可以建立或打開一個現有的數據庫(若是數據庫已存在 則直接打開,不然建立一個新的數據庫),並返回一個可對數據庫進行讀寫操做的對象。不 同的是,當數據庫不可寫入的時候(如磁盤空間已滿)getReadableDatabase()方法返回的對 象將以只讀的方式去打開數據庫,而 getWritableDatabase()方法則將出現異常。ide

SQLiteOpenHelper 中有兩個構造方法可供重寫,通常使用參數少一點的那個構造方法即 可。這個構造方法中接收四個參數,第一個參數是 Context,這個沒什麼好說的,必需要有 它才能對數據庫進行操做。第二個參數是數據庫名,建立數據庫時使用的就是這裏指定的名 稱。第三個參數容許咱們在查詢數據的時候返回一個自定義的 Cursor,通常都是傳入 null。 第 四 個 參 表 示 當 前 數 據 庫 的 版 本 號 , 可 用 於 對 數 據 庫 進 行 升 級 操 做 。 構 建 出 SQLiteOpenHelper 的實例以後,再調用它的 getReadableDatabase()或 getWritableDatabase()方法就可以建立數據庫了,數據庫文件會存放在/data/data/<package name>/databases/目錄下。
此時,重寫的 onCreate()方法也會獲得執行,因此一般會在這裏去處理一些建立表的邏輯。函數

接下來仍是讓咱們經過例子的方式來更加直觀地體會 SQLiteOpenHelper 的用法吧,首先新建一個 DatabaseTest 項目。 這裏咱們但願建立一個名爲 BookStore.db 的數據庫,而後在這個數據庫中新建一張 Book表,表中有 id(主鍵)、做者、價格、頁數和書名等列。建立數據庫表固然仍是須要用建表 語句的,這裏也是要考驗一下你的 SQL 基本功了,Book 表的建表語句以下所示:工具

 

create table Book (佈局

id integer primary key autoincrement, author text,ui

price real, pages integer, name text)

只要你對 SQL 方面的知識稍微有一些瞭解,上面的建表語句對你來講應該都不難吧。SQLite 不像其餘的數據庫擁有衆多繁雜的數據類型,它的數據類型很簡單,integer 表示整型,real 表示浮點型,text 表示文本類型,blob 表示二進制類型。另外,上述建表語句中咱們還使用了 primary key 將 id 列設爲主鍵,並用 autoincrement 關鍵字表示 id 列是自增加的。 而後須要在代碼中去執行這條 SQL 語句,才能完成建立表的操做。新建 MyDatabaseHelper類繼承自 SQLiteOpenHelper,代碼以下所示:

 public class MyDatabaseHelper extends SQLiteOpenHelper {

 

public static final String CREATE_BOOK = "create table book ("

+ "id integer primary key autoincrement, "

+ "author text, "

+ "price real, "

+ "pages integer, "

+ "name text)";

 

 

private Context mContext;

 

 

public MyDatabaseHelper(Context context, String name, CursorFactory factory, int version) {

super(context, name, factory, version);

mContext = context;

}

 

 

@Override

public void onCreate(SQLiteDatabase db) {

db.execSQL(CREATE_BOOK);

Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();

}

 

 

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

 

 

}

能夠看到,咱們把建表語句定義成了一個字符串常量,而後在 onCreate()方法中又調用 了 SQLiteDatabase 的 execSQL()方法去執行這條建表語句,並彈出一個 Toast 提示建立成功, 這樣就能夠保證在數據庫建立完成的同時還能成功建立 Book 表。

如今修改 activity_main.xml 中的代碼,以下所示:

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"

android:orientation="vertical" >

 

<Button android:id="@+id/create_database" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Create database"/>

 

</LinearLayout>

佈局文件很簡單,就是加入了一個按鈕,用於建立數據庫。最後修改 MainActivity 中的 代碼,以下所示:

 

public class MainActivity extends Activity {

 

private MyDatabaseHelper dbHelper;

 

@Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1); Button createDatabase = (Button) findViewById(R.id.create_database); createDatabase.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

dbHelper.getWritableDatabase();

}

});

}

 

}

這裏咱們在 onCreate()方法中構建了一個 MyDatabaseHelper 對象,而且經過構造函數的 參數將數據庫名指定爲 BookStore.db,版本號指定爲 1,而後在 Create database 按鈕的點擊 事件裏調用了 getWritableDatabase()方法。這樣當第一次點擊 Create database 按鈕時,就會檢測 到當前程序中並無 BookStore.db 這個數據庫,因而會建立該數據庫並調用 MyDatabaseHelper中的 onCreate()方法,這樣 Book 表也就獲得了建立,而後會彈出一個 Toast 提示建立成功。

再次點擊 Create database 按鈕時,會發現此時已經存在 BookStore.db 數據庫了,所以不會再 建立一次。

如今就能夠運行一下代碼了,在程序主界面點擊 Create database 按鈕,結果如圖 6.11 所示。

 

圖   6.11

 

此時 BookStore.db 數據庫和 Book 表應該都已經建立成功了,由於當你再次點擊 Create database 按鈕時不會再有 Toast 彈出。但是又回到了以前的那個老問題,怎樣才能證明它們 的確是建立成功了?若是仍是使用 File Explorer,那麼最多你只能看到 databases 目錄下出現 了一個 BookStore.db 文件,Book 表是沒法經過 File Explorer 看到的。所以此次咱們準備換一 種查看方式,使用 adb shell 來對數據庫和表的建立狀況進行檢查。

adb 是 Android SDK 中自帶的一個調試工具,使用這個工具能夠直接對鏈接在電腦上的 手機或模擬器進行調試操做。它存放在 sdk 的 platform-tools 目錄下,若是想要在命令行中使 用這個工具,就須要先把它的路徑配置到環境變量裏。

若是你使用的是 Windows 系統,能夠右擊個人電腦→屬性→高級→環境變量,而後在 系統變量裏找到 Path 並點擊編輯,將 platform-tools 目錄配置進去,如圖 6.12 所示。

圖   6.12

 

若是你使用的是 Linux 系統,能夠在 home 路徑下編輯.bash_profile 文件,將 platform-tools目錄配置進去便可,如圖 6.13 所示:

 

圖   6.13

 

配置好了環境變量以後,就可使用 adb 工具了。打開命令行界面,輸入 adb shell,就 會進入到設備的控制檯,如圖 6.14 所示。

 

圖   6.14

 

而後使用 cd 命令進行到/data/data/com.example.databasetest/databases/目錄下,並使用 ls命令查看到該目錄裏的文件,如圖 6.15 所示。

圖   6.15

 

這個目錄下出現了兩個數據庫文件,一個正是咱們建立的 BookStore.db ,而另外一個 BookStore.db-journal 則是爲了讓數據庫可以支持事務而產生的臨時日誌文件,一般狀況下這 個文件的大小都是 0 字節。

接下來咱們就要藉助 sqlite 命令來打開數據庫了,只須要鍵入 sqlite3,後面加上數據庫 名便可,如圖 6.16 所示。

 

圖   6.16

 

這時就已經打開了 BookStore.db 數據庫,如今就能夠對這個數據庫中的表進行管理了。 首先來看一下目前數據庫中有哪些表,鍵入.table 命令,如圖 6.17 所示。

 

圖   6.17

 

能夠看到,此時數據庫中有兩張表,android_metadata 表是每一個數據庫中都會自動生成的,不用管它,而另一張 Book 表就是咱們在 MyDatabaseHelper 中建立的了。這裏還能夠經過.schema 命令來查看它們的建表語句,如圖 6.18 所示。

 

圖   6.18

 

由此證實,BookStore.db 數據庫和 Book 表確實已是建立成功了。以後鍵入.exit 或.quit命令能夠退出數據庫的編輯,再鍵入 exit 命令就能夠退出設備控制檯了。

相關文章
相關標籤/搜索