鍍金池/ 教程/ Android/ Android內(nèi)容提供者
Android 應(yīng)用組件
使用布局文件自定義Android組件
Android通知
Android主題示例
Android JetPlayer實例
Android MediaPlayer(多媒體播放)
Android AbsoluteLayout
Android FrameLayout
Android Gestures/手勢
Android AutoCompleteTextView(自動完成)實例
Android 資源組織和訪問
Android ListView
Android GridView
Android數(shù)據(jù)備份
Android撥打電話
Android發(fā)送短信/SMS
Android ProgressDialog
SimpleCursorAdapter
Android發(fā)送電子郵件
Android Activity
Android TextView
Android事件處理
Android TableLayout
Android加載Spinner
Android內(nèi)容提供者
Android自定義字體
Android Service
Android CheckBox
Android Intent過濾器
Android LinearLayout
Android登錄實例
Android RadioButton
Android樣式和主題
Android自定義組件及屬性
Android UI控件
Android Animation(動畫)實例
Android Camera(攝像頭)
Android ToggleButton
Android Clipboard(復(fù)制/剪貼板)
Android音頻捕獲(錄音)
發(fā)布Android應(yīng)用
Android Alertdialog(警告對話框)
Android圖片效果
Android內(nèi)部存儲
Android基于位置服務(wù)
Android RadioGroup
Android AutoCompleteTextView
Android Bluetooth(藍(lán)牙)實例
Android RelativeLayout
Android最佳實踐
Android本地化
Android自定義組件
Android教程
Android 架構(gòu)
Android UI布局
Android Button
Android Hello World示例
Android音頻管理器實例
ArrayAdapter
Android拖放
Android碎片/片段
Android圖片切換
Android JSON解析器
Android開發(fā)環(huán)境搭建
Android Spinner
Android樣式示例
使用活動代碼自定義Android組件
Android ImageButton
Android EditText
Android廣播接收器

Android內(nèi)容提供者

內(nèi)容提供程序(Provider)組件從一個應(yīng)用到其他請求提供數(shù)據(jù)。通過 ContentResolver 類的方法這樣的請求處理。內(nèi)容提供程序使用不同的方式來存儲數(shù)據(jù),并且可以將數(shù)據(jù)存儲在數(shù)據(jù)庫中,文件中,甚至在網(wǎng)絡(luò)上。

每一個 Android 應(yīng)用程序運行在自己的進程保持一個應(yīng)用程序數(shù)據(jù),在另外一個應(yīng)用程序中隱藏自己的權(quán)限。但有時需要在應(yīng)用程序之間共享數(shù)據(jù)。這時內(nèi)容提供程序是非常有用。

內(nèi)容提供程序?qū)?nèi)容集中在一個地方,讓許多不同的應(yīng)用訪問。內(nèi)容提供程序的行非常像數(shù)據(jù)庫,可以對它進行查詢,編輯等操作,添加或刪除可使用 insert(), update(), delete(), query() 方法。在大多數(shù)情況下,這些數(shù)據(jù)都存儲在SQlite數(shù)據(jù)庫。

內(nèi)容提供程序?qū)嵤?ContentProvider 類的子類,必須實現(xiàn)了一套標(biāo)準(zhǔn)的 API,使其他應(yīng)用程序來執(zhí)行事務(wù)。

public class MyContentProvider extends  ContentProvider {

}

內(nèi)容的URI

要查詢內(nèi)容提供程序,可以指定 URI 形式如以下格式的查詢字符串:

<prefix>://<authority>/<data_type>/<id>

這里是URI的各個部分的細(xì)節(jié)

部分 描述
prefix 始終設(shè)置內(nèi)容為 ://
authority 規(guī)定內(nèi)容提供商的名稱,例如聯(lián)系人,瀏覽器等。對于第三方內(nèi)容提供商,這可能是完全合格的名稱,如 com.yiibai.statusprovider
data_type 表示數(shù)據(jù),特定提供程序提供的類型。例如,如果得到所有的聯(lián)系人的通訊錄內(nèi)容提供程序,那么數(shù)據(jù)路徑URI是這樣的 content://contacts/people
id 規(guī)定要求的特定記錄。例如,如果正在尋找聯(lián)系人編號為5,在聯(lián)系人內(nèi)容提供者中,則URI是這樣的 content://contacts/people/5.

創(chuàng)建內(nèi)容提供者

以下是簡單的步驟用來創(chuàng)建自己的內(nèi)容提供者的數(shù)量。

  • 首先,需要創(chuàng)建一個內(nèi)容提供者擴展 ContentProvider 基類。

  • 其次,需要定義內(nèi)容提供者用于訪問內(nèi)容的 URI 地址。

  • 接下來,需要創(chuàng)建自己的數(shù)據(jù)庫用于保存內(nèi)容。通常情況下,Android使用SQLite數(shù)據(jù)庫,并且框架需要重寫 onCreate() 方法會使用 SQLite開放的 Helper方法來創(chuàng)建或打開提供者數(shù)據(jù)庫。當(dāng)啟動應(yīng)用程序時,每個內(nèi)容提供者的onCreate()方法調(diào)用處理程序在主應(yīng)用程序。

  • 接下來,必須實現(xiàn)內(nèi)容提供者查詢來執(zhí)行不同的數(shù)據(jù)庫的具體操作。

  • 最后,在activity文件使用<provider>標(biāo)簽注冊內(nèi)容提供者。

下面是需要覆蓋內(nèi)容提供程序類的方法的列表:

  • onCreate() 方法被稱為提供者開始。

  • query() 方法接收來自客戶端的請求。返回的結(jié)果作為一個Cursor對象。

  • insert() 方法插入一條新記錄到內(nèi)容提供者。

  • delete() 方法從內(nèi)容提供者刪除記錄。

  • update() 方法從內(nèi)容提供者更新現(xiàn)有記錄。

  • getType() 此方法在給定的URI返回 MIME 類型的數(shù)據(jù)。

示例

這個例子將解釋如何創(chuàng)建自己的 ContentProvider。因此按照下面的步驟類似于我們之前創(chuàng)建Hello World范例

Step 描述
1 使用Eclipse IDE創(chuàng)建Android應(yīng)用程序,并將它命名為MyContentProviderunder在包com.example.mycontentprovider下并使用空的Activity。
2 修改主要活動文件MainActivity.java增加兩個新的方法onClickAddName() 和 onClickRetrieveStudents()。
3 創(chuàng)建一個新的名為StudentsProvider.java的java文件在packagecom.example.mycontentprovider包下,并定義實際提供者和相關(guān)方法。
4 使用注冊內(nèi)容提供者在AndroidManifest.xml文件中的<provider.../>標(biāo)簽
5 修改res/layout/activity_main.xml文件的默認(rèn)內(nèi)容包括一個小的GUI添加學(xué)生記錄。
6 在res/values/strings.xml文件中定義所需的常量
7 運行該應(yīng)用程序啟動Android模擬器和驗證應(yīng)用程序所做的修改結(jié)果。

以下是主活動文件 src/com.example.mycontentprovider/MainActivity.java 修改后的內(nèi)容。這個文件可以包括每個生命周期方法。我們已經(jīng)增加了兩個新方法onClickAddName() onClickRetrieveStudents() 來處理用戶與應(yīng)用程序交互。

package com.example.mycontentprovider;

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentValues;
import android.content.CursorLoader;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
   }

   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
      getMenuInflater().inflate(R.menu.main, menu);
      return true;
   }

   public void onClickAddName(View view) {
      // Add a new student record
      ContentValues values = new ContentValues();

      values.put(StudentsProvider.NAME, 
      ((EditText)findViewById(R.id.txtName)).getText().toString());
      
      values.put(StudentsProvider.GRADE, 
      ((EditText)findViewById(R.id.txtGrade)).getText().toString());

      Uri uri = getContentResolver().insert(
      StudentsProvider.CONTENT_URI, values);
      
      Toast.makeText(getBaseContext(), 
      uri.toString(), Toast.LENGTH_LONG).show();
   }

   public void onClickRetrieveStudents(View view) {
      // Retrieve student records
      String URL = "content://com.example.provider.College/students";
      Uri students = Uri.parse(URL);
      Cursor c