Android 為了讓我們能夠更加方便的管理數據庫,特意提供了一個SQLiteOpenHelper幫助類,通過借助這個類就可以非常簡單的對數據庫進行創建和升級。
SQLiteOpenHelper是一個抽象類,我們要創建一個自己的幫助類去繼承它。SQLiteOpenHelper有兩個抽象方法,分別是onCreat()和onUpgrade(),我們必須在自己的幫助類里面重這兩個方法,然后分別在這兩個方法中去實現創建、升級數據庫的邏輯。
SQLiteOpenHelper中還有兩個非常重要的實例方法:getReadableDatabase()和getWritableDatabase()。這兩個方法都可以創建或打開一個現有的數據庫,并返回一個可對數據庫進行讀寫操作的對象。不同的是,當數據不可寫入的時候(如磁盤已滿),getReadableDatabase()方法返回的對象將以只可讀的方式去打開數據庫,而getWriteableDatabase()方法將出現異常。
? ? SQLiteOpenHelper中有兩個構造方法可供重寫,一般使用參數少一點的構造方法即可。
這個構造方法中接收4個參數,第一個參數是Context,第二個參數是數據庫名,創建數據庫時使用的就是這里指定的名稱。第三個參數允許我們在查詢數據的時候返回一個自定義的Cursor,一般都是傳入null。第四個參數表示當前數據庫的版本號。
構建出SQLiteOpenHelper的實例之后,再調用他的getReadableDatabase()或getWritableDatabase()方法就能夠創建數據庫了。數據庫文件通常會放在/data/data/<pack name>/database/目錄下。此時,重寫的onCreate()方法也會得到執行。所以通常會在這里去處理一些創建表的邏輯。
新建項目DatabaseTest。
我們希望創建一個名為BookStore.db的數據庫,然后在這個數據庫中新建一張Book表,表中包含主鍵id、作者、價格、頁數和書名等列。創建數據庫表當然還是需要用建表語句的。
新建MyDatabaseHelper類繼承SQLiteOpenHelper,代碼如下:
package com.example.databasetest;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;/*** Created by ZHJ on 2018/3/3.*/public class MyDatabaseHelper extends SQLiteOpenHelper {public static final String CREATE_BOOK ="create table Book("+"id integer primary key autoincrement,"+"auto text,"+"price real,"+"pages integer"+"name text)";private Context mContext;public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version){super(context,name,factory,version);mContext = context;}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(CREATE_BOOK);Toast.makeText(mContext,"Create succeeded",Toast.LENGTH_SHORT).show();}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}
我們把建表語句定義為一個字符串常量,然后在Oncreate()方法中又調用了SQLiteDatabase的execSQL()方法去執行這條建表語句,并彈出一個Toast提示創建成功,這樣我們在保證創建數據庫的同時還是成功創建Book表。
修改activity_main.xml的代碼,如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/create_database"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Create database"/></LinearLayout>
僅僅加入一個按鈕,用于創建數據庫。最后修改MainActivity中的代碼,如下:
package com.example.databasetest;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;public class MainActivity extends AppCompatActivity { private MyDatabaseHelper dbHelper;@Overrideprotected 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 View.OnClickListener() {@Overridepublic void onClick(View view) {dbHelper.getWritableDatabase();}});}
}
我們在onCreate()方法中構建了一個MyDatabaseHelper對象,并且通過構造函數的參數將數據庫指定為BookStore.db,版本號指定為1,然后在Create database按鈕的點擊事件里面調用了getWritableDatabase()方法,這樣,當第一次點擊Create database按鈕時,就會檢測到當前程序中并沒有BookStore.db這個數據庫于是會創建數據庫并調用MyDatabaseHelper中的onCreate()方法,這樣Book表也就得到了創建,然后會彈出一個Toast提示創建成功。再次點擊Create database按鈕時,會發現此時已經存在BookStore.db數據庫了,不會再創建一次。
現在可以運行一下代碼。
怎么樣才能證明數據庫已經創建成功了呢?
我們使用adb shell 來對數據庫和表的創建情況進行檢查。