ContentProvider 操作其他應用的數據庫

最近,用到四大組件之一的ContentProvider來操作其他應用的數據庫。總結幾個遇到的問題。

一、首先是權限問題:
要想查到其他應用的數據庫中的數據。(一般來說是私有數據,共有數據無需設置權限)必須設置查詢該私有數據的權限。因爲,其他應用在暴露Uri的時候一般都是這樣設置的:

<!-- 在application節點下面 -->
<!-- 這是在提供數據庫的應用中的設置 -->
<provider android:name="provider.QQProvider"
          android:authorities="com.tecent.qq.authorties"
          android:export="true"
          android:multiprocess="true"
          android:readPermission="com.tecent.qq.permission.READ_DATABASE">
          <path-permission android:pathPattern="/apks/.*"
              android:permission="com.tecent.qq.READ_PATH" />
          <grant-uri-permission android:pathPrefix="/tecent/userMsg/" />
</provider> 

*關於Uri和provider節點中的幾個屬性的說明:
1> 這是一個提供數據庫數據表的應用的AndroidManifest.xml文件中的配置。
2> name是關聯了本應用中的ContentProvider,根據業務重寫繼承ContentProvider
3> authorities和Uri有關。Uri分成三個部分: 第一是“content://” 第二部分就是authorities 第三部分是”/tableName”
4> multiprocess true表示允許做同步處理,false不是不允許
5> export true表示暴露,false表示隱藏
6> readPermission, writePermission, permission表示數據庫的讀權限、寫權限、權限
7> path-permission中記錄的是訪問某個路徑的權限,另外如果provider中沒有設置權限,單單設置path-permission是無效的
8> grant-uri-permission表示的是可以繞過權限控制來訪問某個目錄。首先,一般來說不需要設置grant-uri-permission。默認的情況是隻要註冊了readPermission、writePermission、permission中的任何一個權限,那麼表示的是grant-uri-permission爲false,也就是說不可以繞過權限控制直接訪問該數據庫。如果在註冊上面所說的三個權限的基礎之上還另外註冊了grant-uri-permission那麼此時表示它爲true,也就是說可以繞過權限控制訪問數據庫(挖槽,那不私有數據都被訪問了,搞毛線啊!!下面說明)
9> App A提供了Provider並且設置了grant-uri-permission和readPermission。那麼App B調用Provider訪問數據庫無需權限。假如有App C要調用App B來使用App A的數據庫時就必須具備權限readPermission

參考:Provider有關權限的資料

二、基本的使用

/**
 * 簡單的ContentProvider的使用方法
 */
private void SimpleSQLiteUseMethod() {
    ContentResolver mContentResolver = getContentResolver();
    Cursor cursor = mContentResolver.query(Constant.CONTENT_URI, null, null, null, null);
    if (cursor == null) {
        Log.d(TAG, "遊標爲空,無法查詢數據");
        return;
    }

    if (!cursor.moveToFirst()) {
        Log.d(TAG, "數據表中沒有數據!");
        return;
    }

    do {
      int _id = cursor.getInt(cursor.getColumnIndex("_id"));
      String name = cursor.getString(cursor.getColumnIndex("name"));
      // TODO
    } while (cursor.moveToNext());
    cursor.close();
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章