簡述:
SQLiteOpenHelper 是一個抽象類,就是說如果我們想要使用它的話,就需要建立一個自己的幫助類去繼承它。
SQLiteOpenHelper 中有兩個抽象方法,分别是
onCreate()和 onUpgrade(),
我們必須在自己的幫助類裡面重寫這兩個方法,然後分别在這兩個方法中去實作建立、更新資料庫的邏輯。
SQLiteOpenHelper 中還有兩個非常重要的執行個體方法 ,
getReadableDatabase() 和getWritableDatabase()。
這兩個方法都可以建立或打開一個現有的資料庫(如果資料庫已存在則直接打開,否則建立一個新的資料庫) ,
并傳回一個可對資料庫進行讀寫操作的對象。
不同的是,當資料庫不可寫入的時候(如磁盤空間已滿)getReadableDatabase()方法傳回的對象将以隻讀的方式去打開資料庫,而 getWritableDatabase()方法則将出現異常。
使用SQLite資料庫步驟:
一、建立自己的類,繼承SQLiteOpenHelper,重寫構造方法,onCreate()和 onUpgrade()。
SQLiteOpenHelper 中有兩個構造方法可供重寫, 一般使用參數少一點的那個構造方法即可。
public MyDatabaseHelper(Context context, String name, CursorFactoryfactory, int version) {
super(context, name, factory, version);
mContext = context;
}
這個構造方法中接收四個參數,
1)、第一個參數是上下文 Context,有它才能對資料庫進行操作。
2)、第二個參數是資料庫名,建立資料庫時的名稱。
3)、第三個參數查詢資料的時候傳回一個自定義的 Cursor,一般都是傳入 null。
4)、第四個參數表示目前資料庫的版本号,可用于對資料庫進行更新操作。
二、執行個體化繼承了SQLiteOpenHelper抽象類的類,調用它的 getReadableDatabase()或 getWritableDatabase()方法
建構出SQLiteOpenHelper 的執行個體之後,再調用它的 getReadableDatabase()或 getWritableDatabase()方法就能夠建立資料庫了,
【資料庫檔案會存放在/data/data/<package name>/databases/目錄下】
此時,重寫SQLiteOpenHelper抽象類的onCreate()方法會得到執行,是以通常會在這裡去處理一些建立表的邏輯。
代碼:
MySQLiteOpenHelper.java中的代碼:
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
/**
* 建立資料庫表book語句 解析: 1)integer 表示整型, 2)real 表示浮點型, 3)text 表示文本類型, 4)blob
* 表示二進制類型。 5)primary key 将 id 列設為主鍵,并用 autoincrement關鍵字表示 id 列是自增長的。
*/
public static final String CREATE_BOOK = "create table book ("
+ "id integer primary key autoincrement, " + "author text, "
+ "price real, " + "pages integer, " + "name text)";
/**
* 建立資料庫表Category 語句
*/
public static final String CREATE_CATEGORY = "create table Category ("
+ "id integer primary key autoincrement, " + "category_name text, "
+ "category_code integer)";
/**
* 上下文對象
*/
private Context context;
/**
* 重寫SQLiteOpenHelper的構造方法,這個構造方法中接收四個參數:
*
* @param context
* (上下文 Context,有它才能對資料庫進行操作)
* @param name
* (是資料庫名,建立資料庫時的名稱)
* @param factory
* (查詢資料的時候傳回一個自定義的 Cursor,一般都是傳入 null)
* @param version
* (目前資料庫的版本号,可用于對資料庫進行更新操作)
*/
public MySQLiteOpenHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
this.context = context;
}
/**
* 執行個體化SQLiteOpenHelper類之後 ,調用getReadableDatabase()或 getWritableDatabase()方法。
* 如果是要建立的資料庫不存在,就執行oncreate()方法,建立資料庫; 如果已經存在要建立的資料庫,則不執行oncreate()方法
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);// 執行sql語句
Toast.makeText(context, "資料庫建立成功", 1).show();
}
/**
* 對資料庫進行更新,注意: switch 中每一個 case的最後都是沒有使用 break ,
* 這是為了保證在跨版本更新的時候,每一次的資料庫修改都能被全部執行到
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (oldVersion) {
case 1:
db.execSQL(CREATE_CATEGORY);
Toast.makeText(context, "更新資料庫,舊版本是" + oldVersion, 1).show();
case 2:
Toast.makeText(context, "更新資料庫,舊版本是" + oldVersion, 1).show();
default:
}
}
}
MainActivity.java中的代碼:
public class MainActivity extends Activity {
private MySQLiteOpenHelper helper;
private Button create_sqliteDataBase;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* 執行個體化MySQLiteOpenHelper,指定資料庫名:Book.db,和版本号 1
* 如果此次執行的版本号,比上次的版本号大(如,上次是1.這次是2),則執行MySQLiteOpenHelper類中的重寫的onUpgrade()方法
*/
helper = new MySQLiteOpenHelper(this, "Book.db", null, 1);
create_sqliteDataBase = (Button) findViewById(R.id.create_sqliteDataBase);
create_sqliteDataBase.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
/**
* 當第一次點選 按鈕時,會檢測 到目前程式中并沒有 Book.db這個資料庫,
* 于是會建立該資料庫并調用 MySQLiteOpenHelper中的 onCreate()方法,這樣 Book表也就得到了建立。
* 再次點選 按鈕時,會發現此時已經存在 BookStore.db 資料庫了,是以不會重複建立一次。
*/
helper.getWritableDatabase();
}
});
}
}
下載下傳連結:
SQLite資料庫建立、更新入門下載下傳位址