內容提供者及內容解析者的實現步驟

一、創建一個類,繼承ContentProvider,重寫onCreate,query,insert,update,delete,getType方法
二、在清單文件中聲明provider節點

<provider
    android:authorities="cn.test.provider"            android:name="cn.test.contactproviderdemo.MyProvider"
    android:exported="true">
</provider>

這裏需要注意的是:
android:authorities這個字符串相當於是一個攔截器,需要對應的URI匹配上才能訪問對應的數據。
另外,在安卓4.4以上的版本中,還需要配置android:exported=”true”
三、通過UriMatcher添加對應的URI匹配規則

private static final UriMatcher sURIMatcher  = new UriMatcher(UriMatcher.NO_MATCH);

    // 這裏設置的數字,不爲-1,但是最好爲正數
    private static final int QUERY_SUCCESS = 1;
    private static final int INSERT_MATCHED = 2;
    private static final int UPDATE_MATCHED = 3;
    private static final int DELETE_MATCHED = 4;

    static {
        // 給當前的URI匹配器添加一條匹配規則
        sURIMatcher.addURI("cn.test.provider", "query", QUERY_SUCCESS);
        sURIMatcher.addURI("cn.test.provider", "insert", INSERT_MATCHED);
        sURIMatcher.addURI("cn.test.provider", "update", UPDATE_MATCHED);
        sURIMatcher.addURI("cn.test.provider", "delete", DELETE_MATCHED);
    }

具體對數據庫的增刪改查,在這裏就不貼代碼出來了,接下來,就是其他應用訪問這個應用的數據庫了。
四、在一個新的工程下面,使用內容解析者獲取數據
示例代碼:

public void query(View v) {
        // 獲取內容解析者
        ContentResolver resolver = getContentResolver();
        Uri uri = Uri.parse("content://cn.test.provider/query");
        Cursor cursor = resolver.query(uri, null, null, null, null);
        while (cursor.moveToNext()) {
            String name = cursor.getString(cursor.getColumnIndex("name"));
            System.out.println("name=" + name);
        }
    }

    public void insert(View v) {
        ContentResolver resolver = getContentResolver();
        Uri uri = Uri.parse("content://cn.test.provider/insert");
        ContentValues values = new ContentValues();
        values.put("name", "二狗子");
        values.put("phone", "489756848");
        values.put("age", 12);
        Uri insert = resolver.insert(uri, values);
        System.out.println(insert);
    }

    public void delete(View v) {
        ContentResolver resolver = getContentResolver();
        Uri uri = Uri.parse("content://cn.test.provider/delete");
        String where = "name = ?";
        String [] selectionArgs = {"大牛"};
        int delete = resolver.delete(uri, where, selectionArgs);
        Toast.makeText(getApplicationContext(), "刪除了" + delete + "條數據", Toast.LENGTH_SHORT).show();
    }

    public void update(View v) {
        ContentResolver resolver = getContentResolver();
        Uri uri = Uri.parse("content://cn.test.provider/update");
        ContentValues values = new ContentValues();
        values.put("name", "小二黑");
        String where = "name = ?";
        String [] selectionArgs = {"二狗"};
        int update = resolver.update(uri, values, where, selectionArgs);
        Toast.makeText(getApplicationContext(), "更新了" + update + "條數據", Toast.LENGTH_SHORT).show();
    }

這裏又一點需要說明的是,Uri資源的訪問,必須加上content://,另外,cn.test.provider對應的是另一個工程再清單文件中android:authorities字段中聲明的字符串,後面跟着的字符比如,query,insert,delete等等,是在另一個工程中,在static靜態代碼塊中由UriMatcher對象add進來的匹配規則,如果對應上就會執行相應的方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章