當你想提供下列功能時就需要適合使用Content Provider:
a. 將資料或檔案提供給其他App。
b. 讓使用者從你的App複製資料到其他App。
c. 使用搜尋架構提供自訂搜尋建議。
d. 想要將資料給widgets使用
e. 想要使用 AbstractThreadedSyncAdapter, CursorAdapter, 或CursorLoader
在資料提供上有兩種型式
a. 檔案資料File data
像是你app內私有空間的檔案, 像是照片, 音樂或是影像
b. 結構性資料 Structured data
通常會存在SQLite中, 也可以存在其他的儲存空間
以下就介紹簡單的用法
1. 官網https://developer.android.com/guide/topics/providers/content-provider-creating.html
2. 在Manifiest內要宣告Provider
ex:
<provider
android:authorities="rx.com.application"
android:name=".database.DbProvider"
android:exported="false" />
3. 要定義相對的URI
public static final Uri CONTENT_URI = new Uri.Builder()
.scheme(SCHEME)
.authority(AUTHORITY)
.appendPath(TABLE_NAME).build();
其中SCHEME就是"content"
AUTHORITY是package
Path則是填對應的Table名稱
4. 接著建立一個class繼承ContentProvider
5. 然後implements 內部的方法
6. 一開始要先訓練路徑, 也就是利用UriMatcher來設定回傳值
ex:
private UriMatcher buildUriMatcher() {
UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(AUTHORITY, TABLE_NAME, URI_RECORD);
return uriMatcher;
}
7. 設定好之後, 在onCreate取得DB和初始化UriMatcher
8. 然後實踐insert的方法, 主要還是實踐DB的insert, 然後回傳Uri即可
long id;
switch (uriMatcher.match(uri)) {
case URI_RECORD:
id = dbManager.insert(TABLE_NAME, contentValues);
break;
default:
throw new UnsupportedOperationException("Uri doesn't match any defined Uris on insert");
}
if (id != -1){
return ContentUris.withAppendedId(uri, id);
}
return null;
9. query則是利用DB的Query來查詢
只是單筆時要判斷寫入Query的where條件
然後回傳Cursor
Cursor cursor = null;
switch (uriMatcher.match(uri)) {
case URI_RECORD_WITH_ID:
selection = (selection != null) ? " AND " + selection : "";
selection = _ID + " = "+ ContentUris.parseId(uri) + selection;
case URI_RECORD:
cursor = dbManager.query(TABLE_NAME, projection, selection, selectionArgs, sortOrder);
break;
default:
throw new UnsupportedOperationException("Uri doesn't match any defined Uris on insert");
}
return cursor;
10. delete也是單純的實踐DB的delete即可
int rowsAffected = 0;
switch (uriMatcher.match(uri)) {
case URI_RECORD:
rowsAffected = dbManager.delete(TABLE_NAME, selection, selectionArgs);
break;
default:
throw new UnsupportedOperationException("Uri doesn't match any defined Uris on delete");
}
return rowsAffected;
11. 最後update也是一樣
int rowsAffected = 0;
switch (uriMatcher.match(uri)) {
case URI_RECORD:
rowsAffected = dbManager.update(TABLE_NAME, value, selection, selectionArgs);
break;
default:
throw new UnsupportedOperationException("Uri doesn't match any defined Uris on delete");
}
return rowsAffected;
最後使用時只要用
getContentResolver().對應的method就可以了
留言列表