怎麼使用安卓的數據庫
1得繼承SQLiteOpenHelper,繼承的類需要重寫 :
一個默認構造,onCreate,onUpgrade 。3個方法;
eg: 默認構造
public MyHelper(Context context) {
/*
* 參數1: Context用來確定數據庫存儲在哪個路徑下
* 參數2: 數據庫文件的名字
* 參數3: 一個用來創建Cursor(結果集)對象的工廠
* 參數4: 版本號, 用來判斷數據庫是創建還是升級(降級)
*/
super(context, "lixiang.db" null, 1);
}
eg: onCreate 在數據庫創建之後執行
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE person(id Integer PRIMARY KEY AUTOINCREMENT, name VARCHAR(20))"); // 執行SQL語句
}
eg: onUpgrade 在數據庫版本升級之後執行
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("ALTER TABLE person ADD balance Integer");
}
使用數據庫
一般數據庫是結合ContentProvider來使用的,ContentProvider是安卓4大組件之一,需要在manifest中進行註冊;
<provider
android:name="com.lixiang.sqlite.provider"
android:authorities="IlixiangProvider" />
//authorities這是一個其他應用程序可以訪問這個provider的“標識”
同時,我們需要添加一個UriMatcher來跟ContentProvider一起結合使用
public boolean onCreate() {
//獲取數據庫對象
MyHelper helper = new MyHelper(getContext());
// 創建Uri匹配器(用來識別Uri)
matcher = new UriMatcher(UriMatcher.NO_MATCH);
);
//manifest 中ContentProvider的“標識”、需要操作的表名、匹配號(如果uri匹配上了會返回這個標識,在執行curd4個方法的時候會用到)
matcher.addURI("IlixiangProvider", "person/#", PERSON_ID);
return true;
}
public Uri insert(Uri uri, ContentValues values) {
//matcher.match(uri)會返回一個匹配id
switch (matcher.match(uri)) {
case PERSON:
//打開數據庫
SQLiteDatabase db = helper.getWritableDatabase();
// 在values中沒有數據的時候, 傳null則不插入任何數據
long id = db.insert("person", null, values);
db.close();
// 把id拼接在Uri後面返回
return ContentUris.withAppendedId(uri, id);
default:
throw new IllegalArgumentException("無法識別的Uri: " + uri);
}
}
在另外一個程序中使用ContentProvider
public void testProvider() {
// 獲取解析器(訪問內容提供者的工具)
ContentResolver resolver = getContext().getContentResolver();
// 指定Uri, 明確要訪問哪個內容提供者,IlixiangProvider這裏就是manifest 中的那個標識
Uri uri = Uri.parse("content://IlixiangProvider");
ContentValues values = new ContentValues();
// 執行Uri指向的內容提供者中的delete()方法
resolver.delete(uri, null, null);
resolver.query(uri, null, null, null, null);
resolver.update(uri, values, null, null);
resolver.insert(uri, values);
}
監聽數據庫修改,自動刷新ui界面
eg: ContentProvider刷新代碼
public Uri insert(Uri uri, ContentValues values) {
switch (matcher.match(uri)) {
case PERSON:
SQLiteDatabase db = helper.getWritableDatabase();
long id = db.insert("person", null, values);
//這句是刷新界面的核心代碼,這個uri也可以自定義,如果自定義的話,在註冊監聽的時候的uri必須和這裏保持一致------------------------------------------
getContext().getContentResolver().notifyChange(uri, null);
//------------------------------------------
db.close();
return ContentUris.withAppendedId(uri, id); // 把id拼接在Uri後面返回
default:
throw new IllegalArgumentException("無法識別的Uri: " + uri);
}
}
eg: 監聽UI刷新代碼
Uri uri = Uri.parse("content://IlixiangProvider/person");
// 註冊觀察者(監聽器)
getContentResolver().registerContentObserver(uri , true, new ContentObserver(new Handler()) {
public void onChange(boolean selfChange, Uri uri) {
if (selfInsert) { // 判斷是否是自己插入的數據
selfInsert = false;
return;
}
list = dao.queryAll(); // 重新查詢
adapter.notifyDataSetChanged(); // 刷新界面
}
});