Android SQLite學習筆記

Joerrot發表於2018-09-01

在Android平臺上,整合了一個嵌入式關係型資料庫—SQLite,SQLite3支援 NULL、INTEGER、REAL(浮點數字)、TEXT(字串文字)和BLOB(二進位制物件)資料型別,雖然它支援的型別只有五種,但實際上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等資料型別,只不過在運算或儲存時會轉成對應的五種資料型別。 

package com.activitytest.databasetest;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;

/**
 * SQLiteOpenHelper是抽象類,必須繼承它才能使用
 *  SQLite最大的特點是你可以儲存任何型別的資料到任何欄位中,無論這列宣告的資料型別是什麼。
 *  例如:可以在Integer型別的欄位中存放字串,或者在布林型欄位中存放浮點數,或者在字元型欄位中存放日期型值。
 *  但有一種情況例外:定義為INTEGER PRIMARY KEY的欄位只能儲存64位整數,當向這種欄位中儲存除整數以外的資料時,將會產生錯誤。
 *   另外, SQLite 在解析create table 語句時,會忽略 create table 語句中跟在欄位名後面的資料型別資訊
 */

public class MyDatabaseHelper extends SQLiteOpenHelper {
    //把建立資料庫表語句等同於字串變數的值,宣告為static使得其隨著類的載入而存在,隨著類的消失而消失,
    //在類第一次被使用時裝載 ,只分配一塊儲存空間,所有此類的物件都可以操控此塊不變的儲存空間
    public final static String CREATE_BOOK = "create table Book("
            +"id integer primary key autoincrement,"
            +"author text,"
            +"price real,"
            +"pages integer,"
            +"name text)";
    public final static String CREATE_CATEGORY = "create table Category("
            +"id integer primary key autoincrement,"
            +"category_name text,"
            +"category_code integer)";
    private Context context;
    //第二個引數為資料庫名字(.db),第三個引數一般傳入null,第四個引數是當前資料庫的版本號
    public MyDatabaseHelper(Context mcontext, String name, SQLiteDatabase.CursorFactory cursorFactory, int version){
        super(mcontext,name,cursorFactory,version);
        context = mcontext;
    }
    //當呼叫SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法獲取用於運算元據庫的SQLiteDatabase例項的時候,
    // 如果資料庫不存在,Android系統會自動生成一個資料庫,接著呼叫onCreate()方法,onCreate()方法在初次生成資料庫時才會被呼叫,
    // 在onCreate()方法裡可以生成資料庫表結構及新增一些應用使用到的初始化資料。
    @Override
    public void onCreate(SQLiteDatabase db) {
        //使用資料庫的execSQL方法,可以以資料庫語言(字串形式)作為引數
        db.execSQL(CREATE_BOOK); //執行建表語句,建立資料庫表
        Toast.makeText(context, "Create succeed", Toast.LENGTH_SHORT).show();
    }
    //onUpgrade()方法在資料庫的版本發生變化時會被呼叫,一般在軟體升級時才需改變版本號,
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //這裡onUpgrade()方法在資料庫版本每次發生變化時都會把使用者手機上的資料庫表刪除,然後再重新建立。
        // 一般在實際專案中是不能這樣做的,正確的做法是在更新資料庫表結構時,還要考慮使用者存放於資料庫中的資料不會丟失。
        db.execSQL("drop table if exists Book");
        db.execSQL("drop table if exists Category");
        onCreate(db);
    }
}
package com.activitytest.databasetest;

import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.Button;

/**
 * Created by 陳偉欽 on 2018/9/1.
 */

public class MainActivity extends Activity {
    private MyDatabaseHelper dbhelper;
    private Button btn;
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button) findViewById(R.id.create_database);
        dbhelper = new MyDatabaseHelper(this,"BookStore.db",null, 2); //當版本號變高之後就會呼叫升級函式
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dbhelper.getWritableDatabase();
                //getWritableDatabase()和getReadableDatabase()方法都可以獲取一個用於運算元據庫的SQLiteDatabase例項。
                // 但getWritableDatabase() 方法以讀寫方式開啟資料庫,一旦資料庫的磁碟空間滿了,資料庫就只能讀而不能寫。
                // 倘若使用的是getWritableDatabase() 方法就會出錯。getReadableDatabase()方法先以讀寫方式開啟資料庫,
                // 如果資料庫的磁碟空間滿了,就會開啟失敗,當開啟失敗後會繼續嘗試以只讀方式開啟資料庫。
                //如果資料庫不存在,Android系統會自動生成一個資料庫,接著呼叫onCreate()方法。
                // onCreate()方法在初次生成資料庫時才會被呼叫,在onCreate()方法裡可以生成資料庫表結構及新增一些應用使用到的初始化資料。
            }
        });
    }
}

 

相關文章