Android中SQLite使用示例
阿新 • • 發佈:2019-01-27
我們首先定義一下資料庫的表名和列名:
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;
}