1. 程式人生 > >Android中SQLite使用示例

Android中SQLite使用示例

我們首先定義一下資料庫的表名和列名:

public class CrimeDbSchema {
    public static final class CrimeTable {
        public static final String NAME = "crimes";

        public static final class Cols {
            public static final String UUID = "uuid";
            public static final String TITLE = "title";
            public
static final String DATE = "date"; public static final String SOLVED = "solved"; } } }

Android中資料庫的建立,一般依賴於繼承SQLiteOpenHelper的子類,例如:

public class CrimeBaseHelper extends SQLiteOpenHelper{
    private static final int VERSION = 1;
    private static final String DATABASE_NAME = "crimeBase.db"
; public CrimeBaseHelper(Context context) { super(context, DATABASE_NAME, null, VERSION); } //重寫onCreate函式,完成資料庫的建立 @Override public void onCreate(SQLiteDatabase sqLiteDatabase) { //呼叫execSQL建立資料庫 //指定表的名稱及其中的列 sqLiteDatabase.execSQL("create table " + CrimeTable.NAME + "("
+ "_id integer primary key autoincrement, " + CrimeTable.Cols.UUID + ", " + CrimeTable.Cols.TITLE + ", " + CrimeTable.Cols.DATE + ", " + CrimeTable.Cols.SOLVED + ")"); } @Override //資料庫升級時才會呼叫,通過VERSION來判斷 public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { } }

定義了SQLiteOpenHelper後,程式碼中通過SQLiteOpenHelper的介面就可以獲得資料庫,類似的程式碼如下:

//在呼叫SQLiteOpenHelper的getWritableDatabase時,SQLiteOpenHelper會判斷資料是否建立過資料庫
//沒有建立過,則回撥子類的onCreate函式進行建立; 否則,根據版本的變化情況,決定是否呼叫onUpgrade
mDataBase = new CrimeBaseHelper(context.getApplicationContext()).getWritableDatabase();

向資料庫寫入資訊時,一般會用到ContentValues,例如:

private static ContentValues getContentValues(Crime crime) {
    //ContentValues以鍵值對的方式寫入資訊
    //其中鍵就是資料庫中的列
    ContentValues values = new ContentValues();
    values.put(CrimeTable.Cols.UUID, crime.getId().toString());
    values.put(CrimeTable.Cols.TITLE, crime.getTitle());
    values.put(CrimeTable.Cols.DATE, crime.getDate().getTime());
    values.put(CrimeTable.Cols.SOLVED, crime.isSolved() ? 1 : 0);

    return values;
}

有了ContentValues後,就可對資料庫進行增、刪、改、查操作,例如:

public void addCrime(Crime c) {
    ContentValues values = getContentValues(c);
    //資料庫的插入操作
    mDataBase.insert(CrimeTable.NAME, null, values);
}

public void removeCrime(Crime c) {
    //資料庫刪除操作
    mDataBase.delete(CrimeTable.NAME,
            CrimeTable.Cols.UUID + " = ?",
            new String[] {c.getId().toString()});
}

public void updateCrime(Crime c) {
    String uuidString = c.getId().toString();
    ContentValues values = getContentValues(c);

    //資料庫更新的操作
    mDataBase.update(CrimeTable.NAME, values,
            CrimeTable.Cols.UUID + " = ?",
            new String[] {uuidString});
}

private CrimeCursorWrapper queryCrimes(String whereClause, String[] whereArgs) {
    //query介面將返回一個Cursor物件
    Cursor cursor = mDataBase.query(
            CrimeTable.NAME,
            null,
            whereClause,
            whereArgs,
            null,
            null,
            null);
    //從Cursor物件中,再進一步解析出資料
    //由於Cursor解析資料的過程比較繁瑣,因此一般定義一個CursorWrapper來封裝對應的操作
    return new CrimeCursorWrapper(cursor);
}

以上API引數的具體含義,參考SQLiteDatabase中的註釋即可,此處不做進一步描述。

CursorWrapper實現的例子,如下:

public class CrimeCursorWrapper extends CursorWrapper{
    public CrimeCursorWrapper(Cursor cursor) {
        super(cursor);
    }

    public Crime getCrime() {
        //CursorWrapper繼承Cursor的全部方法
        String uuidString = getString(getColumnIndex(CrimeTable.Cols.UUID));
        String title = getString(getColumnIndex(CrimeTable.Cols.TITLE));
        long date = getLong(getColumnIndex(CrimeTable.Cols.DATE));
        int isSolved = getInt(getColumnIndex(CrimeTable.Cols.SOLVED));

        Crime crime = new Crime(UUID.fromString(uuidString));
        crime.setTitle(title);
        crime.setDate(new Date(date));
        crime.setSolved(isSolved != 0);

        return crime;
    }
}

當然,在獲取到Cursor後,需要主動關閉它,例如:

public List<Crime> getCrimes() {
    List<Crime> crimes = new ArrayList<>();

    CrimeCursorWrapper cursor = queryCrimes(null, null);

    //前面已經提到過,CursorWrapper繼承了Cursor的所有方法
    try {
        cursor.moveToFirst();
        while(!cursor.isAfterLast()) {
            crimes.add(cursor.getCrime());
            cursor.moveToNext();
        }
    } finally {
        //使用後關閉
        cursor.close();
    }

    return crimes;
}