SQLite資料庫存儲 創建資料庫 Android專門提供了一個 SQLiteOpenHelper幫助類對資料庫進行創建和升級 SQLiteOpenHelper需要創建一個自己的幫助類去繼承它並且重寫它的兩個抽象方法,即 onCreate() 和 onUpgrade() SQLiteOpenHelp ...
SQLite資料庫存儲(上)
創建資料庫
Android專門提供了一個 SQLiteOpenHelper幫助類對資料庫進行創建和升級
SQLiteOpenHelper需要創建一個自己的幫助類去繼承它並且重寫它的兩個抽象方法,即 onCreate() 和 onUpgrade()
SQLiteOpenHelper 中有兩個重要的實例方法:getReadableDatabase() 和 getWritableDatabase(),第一個方法可以在磁碟空間已滿的時候,只讀數據,而第二種方法在空間已滿的時候,則會出現異常
創建一個名為 BookStore.db 的資料庫
在這個資料庫中新建一張 book表,表中有 id(主鍵)、作者、價格、頁數和書名等列
我們在我們的項目當中新建 MyDatabaseHelper類,並繼承自 SQLiteOpenHelper,後面則可以在我們的主活動當中啟用這段新建的代碼,這個類的代碼如下:
package com.example.lenovo.studyittwo; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.widget.Toast; public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String CREATE_BOOK = "create table book(" +"id integer primary key autoincrement," +"author text," +"price real," +"pages integer," +"name text)"; private Context mContext;//至於為什麼我們要使用下麵這段代碼以及為什麼要定義這個私有的變數,書上並沒有寫我也不知道 /** * 構造方法 * @param context * @param name 資料庫名 * @param factory 允許我們在查詢數據的時候返回一個自定義的 Cursor,一般都是傳入 null * @param version 當前資料庫的版本號,可用於對資料庫進行升級操作 */ public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); mContext = context; } /** * 創建資料庫 * @param db */ @Override public void onCreate(SQLiteDatabase db) {
//SQLiteDatabase這個資料庫是本身就存在的,並不需要我們自己去寫,因為在前面的代碼當中我們已經進行了import操作 // 執行建表語句 db.execSQL(CREATE_BOOK); Toast.makeText(mContext,"創建資料庫功",Toast.LENGTH_LONG).show(); } /** * 升級資料庫 * @param db * @param oldVersion * @param newVersion */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
下麵是主活動的代碼。也十分容易理解,我們在一個按鈕的事件當中加入主活動與這個類相聯繫的函數就可以了:
package com.example.lenovo.studyittwo; import android.content.IntentFilter; import android.content.SharedPreferences; 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; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 構建MyDatabaseHelper對象,指定資料庫名為"BookStore.db、版本號為1 dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1); Button btn_create_database = (Button) findViewById(R.id.creat); btn_create_database.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 創建或打開一個現有的資料庫(已存在則打開,否則創建一個新的)雖然這很顯然,但是我們怎麼創建或者打開自己所指定的資料庫呢?難道就只能夠打開我們剛剛創建的這一個資料庫嗎? dbHelper.getWritableDatabase(); } }); }}
下麵是我們主界面的代碼,只需要創建一個按鈕就可以了:
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <Button android:id="@+id/creat" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Creat database"/> </android.support.constraint.ConstraintLayout>
最後,我們只需要按住這個按鈕,界面上就會彈出“資料庫創建成功”的toast資陽區,再次點擊的時候就不會出現了,但我們可以使用另外的的方法來查看我們創建資料庫成功沒,打開cmd就可以很容易地查看了。
二.往資料庫當中再添加新表的方法
假設我們往資料庫當中加入category這張表的話,代碼首先從我們剛剛創建的類里在添加一段創建表的代碼就可以了,同時在建表語句onCreate函數下添加建表語句
db.execSQL(CREATE_CATEGORY);
最後我們在
onUpgrade()方法內寫上:
db.execSQL("drop table if exists Book");
db.execSQL("drop table if exists Category")
onCreate(db);
這樣子就可以避免我們必須卸載我們的軟體才可以在點擊create database之後出現“新建資料庫成功”的Toast字樣。
代碼如下:
package com.example.lenovo.studyittwo; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.widget.Toast; public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String CREATE_BOOK = "create table book(" +"id integer primary key autoincrement," +"author text," +"price real," +"pages integer," +"name text)"; public static final String CREATE_CATEGORY="create table Category(" +"id integer primary key autoincrement," +"category_name text," +"category_code integer)"; private Context mContext;//至於為什麼我們要使用下麵這段代碼以及為什麼要定義這個私有的變數,書上並沒有寫我也不知道 /** * 構造方法 * @param context * @param name 資料庫名 * @param factory 允許我們在查詢數據的時候返回一個自定義的 Cursor,一般都是傳入 null * @param version 當前資料庫的版本號,可用於對資料庫進行升級操作 */ public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); mContext = context; } /** * 創建資料庫 * @param db */ @Override public void onCreate(SQLiteDatabase db) { // 執行建表語句 db.execSQL(CREATE_BOOK); db.execSQL(CREATE_CATEGORY); Toast.makeText(mContext,"創建資料庫功",Toast.LENGTH_LONG).show(); } /** * 升級資料庫 * @param db * @param oldVersion * @param newVersion */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("drop table if exists Book"); db.execSQL("drop table if exists Category"); onCreate(db); } }
在寫完這段代碼之後,由於我們使用了
onUpgrade()函數
因此我們在主活動當中對代碼進行一定的更改,將主活動當中的
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
更改成:
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);
確保後面的版本號為2才可以使用這個升級的函數,具體主活動的代碼如下:
package com.example.lenovo.studyittwo; import android.content.IntentFilter; import android.content.SharedPreferences; 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; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 構建MyDatabaseHelper對象,指定資料庫名為"BookStore.db、版本號為1,版本號改為2之後則會直接 dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2); Button btn_create_database = (Button) findViewById(R.id.creat); btn_create_database.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 創建或打開一個現有的資料庫(已存在則打開,否則創建一個新的) dbHelper.getWritableDatabase(); } }); }}
最終就可以得到新表插入成功的結果了。