標籤:
//此系列博文是《第一行Android代碼》的學習筆記,如有錯漏,歡迎指正!
Android 為了讓我們能夠更加方便地管理資料庫,專門提供了一個 SQLiteOpenHelper協助類, 藉助這個類我們可以方便地對資料庫進行建立和升級。首先,由於SQLiteOpenHelpe是一個抽象類別,所以我們需要建立一個類來繼承它。SQLiteOpenHelper 中有兩個抽象方法,分別是onCreate()和 onUpgrade(),我們必須在自己的協助類裡面重寫這兩個方法,然後分別在這兩個方法中去實現建立、升級資料庫的邏輯。SQLiteOpenHelper 中 還 有 兩 個 非 常 重 要 的 實 例 方 法 , getReadableDatabase() 和getWritableDatabase()。這兩個方法都可以建立或開啟一個現有的資料庫(如果資料庫已存在則直接開啟,否則建立一個新的資料庫) ,並返回一個可對資料庫進行讀寫操作的對象。不同的是,當資料庫不可寫入的時候(如磁碟空間已滿)getReadableDatabase()方法返回的對象將以唯讀方式去開啟資料庫,而 getWritableDatabase()方法則將出現異常。
SQLiteOpenHelper中有兩個構造方法可供重寫, 一般使用參數少一點的那個構造方法即可。這個構造方法中接收四個參數,第一個參數是 Context,這個沒什麼好說的,必須要有它才能對資料庫進行操作。第二個參數是資料庫名,建立資料庫時使用的就是這裡指定的名稱。第三個參數允許我們在查詢資料的時候返回一個自訂的 Cursor,一般都是傳入 null。第四個參數表示當前資料庫的版本號碼,可用於對資料庫進行升級操作。下面我們來試一試資料庫的使用。
一、建立 MyDatabaseHelper類繼承自 SQLiteOpenHelper:
1 public class MyDatabaseHelper extends SQLiteOpenHelper { 2 public static final String CREATE_BOOK = "create table book (" 3 + "id integer primary key autoincrement, " 4 + "author text, " 5 + "price real, " 6 + "pages integer, " 7 + "name text)"; 8 private Context mContext; 9 public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory10 factory, int version) {11 super(context, name, factory, version);12 mContext = context;13 }14 @Override15 public void onCreate(SQLiteDatabase db) {16 db.execSQL(CREATE_BOOK);17 Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();18 }19 @Override20 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {21 }22 }
我們把建表語句定義成了一個字串常量,然後在 onCreate()方法中又調用了 SQLiteDatabase 的 execSQL()方法去執行這條建表語句,並彈出一個 Toast提示建立成功,這樣就可以保證在資料庫建立完成的同時還能成功建立 Book 表。
二、編寫布局檔案:
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 3 android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" 4 android:paddingRight="@dimen/activity_horizontal_margin" 5 android:paddingTop="@dimen/activity_vertical_margin" 6 android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> 7 8 <Button 9 android:id="@+id/create_database"10 android:layout_width="match_parent"11 android:layout_height="wrap_content"12 android:text="Create database"13 />14 </RelativeLayout>
View Code
我們在介面中加入了一個按鈕,用於建立資料庫。
三、修改 MainActivity中的代碼:
1 public class MainActivity extends AppCompatActivity { 2 3 private MyDatabaseHelper dbHelper; 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.activity_main); 8 dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1); 9 Button createDatabase = (Button) findViewById(R.id.create_database);10 createDatabase.setOnClickListener(new View.OnClickListener() {11 @Override12 public void onClick(View v) {13 dbHelper.getWritableDatabase();14 }15 });16 }17 }View Code
我們在 onCreate()方法中構建了一個 MyDatabaseHelper對象,並且通過建構函式的參數將資料庫名指定為 BookStore.db,版本號碼指定為 1,然後在 Create database 按鈕的點擊事件裡調用了 getWritableDatabase()方法。這樣當第一次點擊 Create database按鈕時,就會檢測到當前程式中並沒有 BookStore.db這個資料庫, 於是會建立該資料庫並調用 MyDatabaseHelper中的 onCreate()方法,這樣 Book表也就得到了建立,然後會彈出一個 Toast提示建立成功。再次點擊 Create database按鈕時,會發現此時已經存在 BookStore.db資料庫了,因此不會再建立一次。
程式運行如下:
此時進入到com.mycompany.database/databases 中可看到BookStore已被建立了:
這個目錄下出現了兩個資料庫檔案,一個正是我們建立的 BookStore.db,而另一個BookStore.db-journal 則是為了讓資料庫能夠支援事務而產生的臨時記錄檔,通常情況下這個檔案的大小都是 0 位元組。
//End.
Android學習筆記(十六)——資料庫操作(上)