學習 ContentProvider

怎麼使用安卓的數據庫

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();         // 刷新界面
            }
        }); 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章