ContentProvider 是 Android 四大組件之一,主要用於在不同應用程式之間共享數據。它提供了一套標準的介面,讓應用程式可以安全地存取其他應用的資料,例如聯絡人、媒體檔案、用戶字典等。
content://authority/path。以下範例展示如何在 Fragment 中實現用戶字典的查詢與插入操作。
包含一個輸入框、兩個按鈕(查詢、插入)和一個 ListView 用於顯示結果。
public void insertSearch() {
Uri mNewUri;
ContentValues mNewValues = new ContentValues();
mNewValues.put(UserDictionary.Words.APP_ID, "example.user2");
mNewValues.put(UserDictionary.Words.LOCALE, "en_US");
mNewValues.put(UserDictionary.Words.WORD, "insert2");
mNewValues.put(UserDictionary.Words.FREQUENCY, "100");
mNewUri = getActivity().getContentResolver().insert(
UserDictionary.Words.CONTENT_URI, mNewValues);
}
public void querySearch() {
String[] mProjection = {
UserDictionary.Words._ID,
UserDictionary.Words.WORD,
UserDictionary.Words.LOCALE
};
String mSelectionClause = null;
String[] mSelectionArgs = { "" };
mSearchString = content_provider_edt.getText().toString();
if (TextUtils.isEmpty(mSearchString)) {
mSelectionClause = null;
mSelectionArgs[0] = "";
} else {
mSelectionClause = UserDictionary.Words.WORD + " = ?";
mSelectionArgs[0] = mSearchString;
}
Cursor mCursor = getActivity().getContentResolver().query(
UserDictionary.Words.CONTENT_URI,
mProjection,
mSelectionClause,
mSelectionArgs,
"word ASC"
);
// 處理結果並綁定到 ListView
if (mCursor != null && mCursor.getCount() > 0) {
String[] mWordListColumns = { UserDictionary.Words.WORD, UserDictionary.Words.LOCALE };
int[] mWordListItems = { R.id.dictWord, R.id.locale };
SimpleCursorAdapter adapter = new SimpleCursorAdapter(
getActivity(), R.layout.wordlistrow, mCursor,
mWordListColumns, mWordListItems, 0);
mWordList.setAdapter(adapter);
}
}
Fragment 中完整實現了生命週期回調方法(onAttach, onCreate, onResume, onPause 等),並通過 Log 輸出方便調試。
ContentProvider 是 Android 數據共享的基石,掌握其基本操作對於開發需要跨應用訪問數據的應用至關重要。本文通過用戶字典的實例,展示了插入、查詢的完整流程,為進一步學習自定義 ContentProvider 打下基礎。