Android_新建數據庫
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_新建數據庫