標籤:rom href 操作 aci 運算 shared 浮點型 會話 TE
SQLite 是一款輕量級的關係型資料庫,它的運算速度非常快, 佔用資源很少,通常只需要幾百 K 的記憶體就足夠了,因而特別適合在行動裝置上使用。SQLite 不僅支援標準的 SQL 文法,還遵循了資料庫的 ACID 事務,所以只要你以前使用過其他的 關係型資料庫,就可以很快地上手 SQLite。而 SQLite 又比一般的資料庫要簡單得多,它甚 至不用設定使用者名稱和密碼就可以使用。Android 正是把這個功能極為強大的資料庫嵌入到了 系統當中,使得本地持久化的功能有了一次質的飛躍。
前面我們所學的檔案儲存體和 SharedPreferences 儲存畢竟只適用於去儲存一些簡單的資料 和索引值對,當需要儲存大量複雜的關係型資料的時候,你就會發現以上兩種儲存方式很難應 付得了。比如我們手機的簡訊程式中可能會有很多個會話,每個會話中又包含了很多條資訊 內容,並且大部分會話還可能各自對應了電話簿中的某個連絡人。很難想象如何用檔案或者 SharedPreferences 來儲存這些資料量大、結構性複雜的資料吧?但是使用資料庫就可以做得 到。那麼我們就趕快來看一看,Android 中的 SQLite 資料庫到底是如何使用的。
建立資料庫
Android 為了讓我們能夠更加方便地管理資料庫,專門提供了一個 SQLiteOpenHelper 幫 助類,藉助這個類就可以非常簡單地對資料庫進行建立和升級。既然有好東西可以直接使用, 那我們自然要嘗試一下了,下面我就將對 SQLiteOpenHelper 的基本用法進行介紹。
首先你要知道 SQLiteOpenHelper 是一個抽象類別,這意味著如果我們想要使用它的話, 就需要建立一個自己的協助類去繼承它。SQLiteOpenHelper 中有兩個抽象方法,分別是 onCreate()和 onUpgrade(),我們必須在自己的協助類裡面重寫這兩個方法,然後分別在這兩 個方法中去實現建立、升級資料庫的邏輯。
SQLiteOpenHelper 中 還 有 兩 個 非 常 重 要 的 實 例 方 法 , getReadableDatabase() 和 getWritableDatabase()。這兩個方法都可以建立或開啟一個現有的資料庫(如果資料庫已存在 則直接開啟,否則建立一個新的資料庫),並返回一個可對資料庫進行讀寫操作的對象。不 同的是,當資料庫不可寫入的時候(如磁碟空間已滿)getReadableDatabase()方法返回的對 象將以唯讀方式去開啟資料庫,而 getWritableDatabase()方法則將出現異常。
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,
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 命令就可以退出裝置控制台了。
===================================================================================================
1,進入到控制台中,輸入adb shell,進入到命令模式的環境中
2,輸入:cd /data/data/
3, 選擇你所在的資料庫檔案,比如我的com.android.homework, 輸入命令:cd com.android.homework
4, 可以使用ls -l 命令查看目前的目錄中的檔案
5,輸入: cd databases 進入到資料庫檔案中
6, ls -l 顯示你資料庫中你建立的資料庫
7, sqlite3 info.db 進入到你選擇的資料庫中
8, .tables :查看你建的表
9, select * from table_name;s 可以查看整個表的資訊
10, 使用其他的SQL語句可以進一步對錶進行操作,注意SQL語句必須用分號(;)結尾
如所示:
Android_建立資料庫