首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

Android ContentProvider 基礎入門與實戰

     編輯:C++ 入門

什麼是 ContentProvider?

ContentProvider 是 Android 四大組件之一,主要用於在不同應用程式之間共享數據。它提供了一套標準的介面,讓應用程式可以安全地存取其他應用的資料,例如聯絡人、媒體檔案、用戶字典等。

核心概念

  • URI:統一資源標識符,用於唯一標識數據資源,格式為 content://authority/path。
  • ContentResolver:客戶端通過該類與 ContentProvider 交互,提供查詢、插入、更新、刪除等方法。
  • Cursor:查詢結果的游標,用於遍歷返回的數據集。

實戰:操作用戶字典

以下範例展示如何在 Fragment 中實現用戶字典的查詢與插入操作。

1. 介面佈局

包含一個輸入框、兩個按鈕(查詢、插入)和一個 ListView 用於顯示結果。

2. 核心代碼解析

插入數據

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 輸出方便調試。

最佳實踐建議

  1. 查詢操作應在子線程中執行,避免阻塞 UI 線程。
  2. 使用 CursorLoader 實現異步加載,自動處理生命週期。
  3. 妥善關閉 Cursor,防止內存洩漏。
  4. 定義明確的權限,保護敏感數據。

總結

ContentProvider 是 Android 數據共享的基石,掌握其基本操作對於開發需要跨應用訪問數據的應用至關重要。本文通過用戶字典的實例,展示了插入、查詢的完整流程,為進一步學習自定義 ContentProvider 打下基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved