Android原生SQL接口
簡(jiǎn)單示例
定義Schema
通過定義Scheme
來聲明表的表名,表頭等信息扯俱。
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";
}
}
}
實(shí)現(xiàn)SQLiteOpenHelper
SQLiteOpenHelper
類管理數(shù)據(jù)庫(kù)的創(chuàng)建课幕、升級(jí)铅忿、版本號(hào)等檩咱。
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);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + CrimeTable.NAME + "(" +
" _id integer primary key autoincrement, " +
CrimeTable.Cols.UUID + ", " +
CrimeTable.Cols.TITLE + ", " +
CrimeTable.Cols.DATE + ", " +
CrimeTable.Cols.SOLVED +
")"
);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }
}
使用SQLiteOpenHelper
打開數(shù)據(jù)庫(kù)
- 數(shù)據(jù)庫(kù)的生命周期與應(yīng)用一樣舀寓,所以應(yīng)該
getApplicationContext()
來作為數(shù)據(jù)庫(kù)的Context
斑唬。 - 調(diào)用
getWritableDatabase()
時(shí)的流程:- 確認(rèn)目標(biāo)數(shù)據(jù)庫(kù)存在市埋。
- 如果不存在就創(chuàng)建數(shù)據(jù)庫(kù),然后初始化數(shù)據(jù)(調(diào)用
onCreate()
)恕刘。 - 如果存在就打開并確認(rèn)
CrimeDbSchema
是否是最新版本缤谎。 - 如果是舊版就升級(jí)到新版(調(diào)用
onUpgrade()
)。
// ...
private final Context mContext;
private final SQLiteDatabase mDatabase;
// ...
mContext = context.getApplicationContext();
mDatabase = new CrimeBaseHelper(mContext).getWritableDatabase();
// ...
創(chuàng)建ContentValues
類對(duì)象
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);
增
insert()
第二的參數(shù)是String
類型褐着,名為nullColumnHack
坷澡,當(dāng)values
是一個(gè)空ContentValues
類型對(duì)象時(shí),若不給出第二個(gè)參數(shù)含蓉,可能會(huì)SQLite
會(huì)說無法插入频敛,如果給出一個(gè)String
作為uuid
项郊,可以使SQLite
能插入空ContentValues
類型對(duì)象。
// ...
private final SQLiteDatabase mDatabase;
// ...
ContentValues values = getContentValues(c);
mDatabase.insert(CrimeTable.NAME, null, values);
改
// ...
private final SQLiteDatabase mDatabase;
// ...
String uuidString = crime.getId().toString();
ContentValues values = getContentValues(crime);
mDatabase.update(CrimeTable.NAME, values, CrimeTable.Cols.UUID + " = ?", new String[]{uuidString});
查
使用query()
查詢斟赚,返回類似迭代器的Cursor
類對(duì)象着降。
// ...
private final SQLiteDatabase mDatabase;
// ...
Cursor cursor = mDatabase.query(CrimeTable.NAME, null, whereClause, whereArgs, null, null, null);
刪
// ...
private final SQLiteDatabase mDatabase;
// ...
String uuidString = crime.getId().toString();
ContentValues values = getContentValues(crime);
mDatabase.delete(CrimeTable.NAME, whereClause, whereArgs);
CursorWrapper類
創(chuàng)建
用CursorWrapper
類包裝Cursor
,使之變得易用拗军。
public class CrimeCursorWrapper extends CursorWrapper {
public CrimeCursorWrapper(Cursor cursor) {
super(cursor);
}
public Crime getCrime() {
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;
}
}
使用示例1
CrimeCursorWrapper cursor = /* 獲取cursor */;
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
crimes.add(cursor.getCrime());
cursor.moveToNext();
}
cursor.close();
使用示例2
CrimeCursorWrapper cursor = /* 獲取cursor */;
try {
if (cursor.getCount() == 0) {
return null;
}
cursor.moveToFirst();
return cursor.getCrime();
}
finally {
cursor.close();
}
注意事項(xiàng)
-
Cursor
類對(duì)象或CursorWrapper
類對(duì)象用完要close()
任洞。