轉載 Android開發ContentProvider/Cursor的使用

   ContentProvider是Android四大組件之一,因此若是是本身實現 ContentProvider,須要在AndroidManifest.xml文件中進行聲明,幸運的是,咱們不多須要本身定義實現它,通常咱們的開發只須要用到系統本身提供的 ContentProvider,使用起來很是方便。
首先來讓咱們認識 ContentProvider:
基本概念:
1. ContentProvider提供爲存儲和獲取數據提供了統一的接口
2.使用 ContentProvider能夠在不一樣的應用程序之間共享數據
3.Android爲常見的一些數據提供了 ContentProvider
 下面我開始介紹實現 ContentProvider的過程:
1.定義一個CONTENT_URI常量
2.定義一個雷,繼承自 ContentProvider
3.實現query,insert,update,delete,getType和onCreate方法
4.在AndroidManifest.xml文件中進行聲明
ContentProvider提供了一系列的函數,當本身實現 ContentProvider須要實現這些方法:
1.query()
2.insert()
3.update()
4.delete()
5.getType()
6.onCreate()
接下來詳細介紹 ContentProvider:
 *一.初識Content Provider
 * 1.簡介
 * 1.1 Content Provider實現了一組通用的方法來提供數據的增刪改查的功能
 * 1.2 客戶端一般不會直接使用這些方法,大多數都是經過ContentResolver對象實現對Content Provider的操做
 * 1.3 開發通常會經過調用方法得到 ContentProvider對象
 * 例如:ContentResolver cr=getContentResolver
 * 使用ContentResolver提供的方法能夠得到 ContentProvider中任何感興趣的對象
 * 2.數據模型
 * 2.1  ContentProvider使用基於數據庫模型的簡單表格來提供其中的數據,其中每一行都表明一個記錄,
 * 每一列表明特定類型和含義的數據,其中每條記錄包含一個數值型的_ID字段,用於在表格中惟一標識該記錄
 * 注意:ID字段前還包含了一個下劃線
 * 2.2 查詢返回一個 Cursor對象,它能遍歷各行各列來讀取每一個字段的值。對於各個類型的數據, Cursor對象都提供了
 * 專用的方法,所以,爲了讀取字段的數據,開發人員必需要知道當前字段包含的數據類型
 * 注意: Cursor的使用方法:經過查詢,它會指向第一個記錄以前,因此須要開發者moveToNext,且查詢字段的動做是
 * 先指向某一條記錄,即指向某一行,再從某一列或多列中取得數據,且須要知道數據類型(列數據),例如:
 * int id=cursor.getInt(idIndex);
 * String name=cursor.getString(displayNameIndex);
 * 3.URI的用法
 * 3.1 每一個Content Provider提供公共的URI(使用Uri類包裝)來惟一標識其數據集。管理多個數據集(多個表格)的
 * Content Provider爲每一個都提供了單獨的URI,且URI的標識有固定的格式
 * 3.2 UIR常量用於全部與Content Provider的交互中,每一個ContentResolver方法使用URI做爲第一個參數,它標識
 * ContentResolver應該使用哪一個provider以及其中的哪一個表格
 * 二.詳解Content Provider
 * 1.系統預約義的Content Provider
 * 1.1 Android系統爲經常使用數據類型提供了不少預約義的Content Provider(聲音,視頻,圖片,聯繫人等),它們大都位於
 * android.provider包中
 * 1.2 Android系統提供的常見Content Provider說明以下:
 *     Browser:讀取或修改書籤,瀏覽歷史或網絡搜索
 *     CallLog:查看或更新通話歷史
 *     Contacts:獲取,修改或保存聯繫人信息
 *     LiveFolders:由Content Provider提供內容的特定文件夾
 *     MediaStore:訪問聲音,視頻和圖片
 *     Setting:查看和獲取藍牙設置,鈴聲和其餘設置偏好
 *     SearchRecentSuggestions:該類能爲應用程序建立簡單的查詢建議提供者
 *     SyncStateContract:用於使用數據數組帳號關聯數據的 ContentProvider約束
 *     UserDictionary:在可預測文本輸入時,提供用戶定義的單詞給輸入法使用
 * 2. 查詢數據
 * 2.1 在Content Provider中查詢數據,開發人員須要知道一下信息:
 *     標識該Content Provider的URI
 *     須要查詢的數據字段名稱
 *     字段中數據的類型
 * 若是須要查詢特定記錄,那麼還須要知道該記錄的ID值
 * 2.2 ContentResolver.query()或Activity.managedQuery()方法均可以完成查詢功能,這兩個方法
 * 使用相同的參數,而且都返回 Cursor對象。其區別在於managedQuery()方法讓Activity來管理 Cursor的
 * 聲明週期,而query()方法須要程序員本身管理。
 * 2.3 query()方法介紹
 * 方法的聲明以下:
 * public final  Cursor query(Uri uri, String[] projection, String selection, 
 * String[] selectionArgs, String sortOrder)
 *    uri:用於查詢的Content Provider的URI值
 *    projection:由須要查詢的列名組成的數組,若是爲null則表示查詢所有列
 *    selection:相似SQL中的WHERE子句,用於增長條件來完成數據過濾
 *    selectionArgs:用於替換selection中可使用?表示的變量值
 *    sortOrder:用於實現排序功能
 * 返回值: Cursor對象,它位於第一條記錄以前,或者爲null
 * 2.4 利用遊標工具進行查詢時,注意是兩次查詢,首先到達的那條記錄的行
 * 第一次查詢找到須要數據的那一列,第二次查詢纔是真正從那一列中得到數據
 * 三.總結
 * 3.1 Content Provider是Android四大基本組件之一,它主要用於在不一樣的應用程序之間共享數據
 * 3.2 Content Provider使用基於數據庫模型的簡單表格來提供其中的數據,這裏每行表明一條記錄,每列
 * 表明特定類型和含義的數據
下面我用一個例子來講明 ContentProvider的使用:
咱們在開發的過程當中常常用到聯繫人的信息,因此,取得聯繫人的信息並操縱就顯得很重要,下面的例子就是對聯繫人的信息進行相關的操做。
下面的截圖是程序的實現:

rrrrr

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
     
    public class Content_Provider_Activity extends Activity {
    private ListView listView;
    private ListView listView2;
    private Button button;
    /*
     * 1.靜態常量的定義
     * 1.1 各個參數用於選擇的目標,若是在數組中沒有某個參數,則遊標不會定義(即找到那個參數)
     * 1.2 從定義能夠看出,聯繫人的全部信息不是定義在一張表之中
     * 1.3 爲了操做的方便和可行,分開定義查找的目標
     */
    public static final String[] COLUMNS={Contacts._ID,
        Contacts.DISPLAY_NAME};
    private static final String[] COLUMNS2={Contacts.DISPLAY_NAME,Contacts._ID};
    private static final String[] COLUMNS3={Phone.NUMBER};
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_content__provider_);
        listView=(ListView)findViewById(R.id.listview);
        listView2=(ListView)findViewById(R.id.listview2);
        button=(Button)findViewById(R.id.button);
        button.setText("點擊獲取聯繫人姓名和手機號碼");
        button.setOnClickListener(new MyButton());
        @SuppressWarnings("deprecation")
        <a title="Cursor" href=" http://www.android-study.com/jichuzhishi/547.html">Cursor</a> cursor=managedQuery(Contacts.CONTENT_URI, COLUMNS, null, null, null);
        //獲取ID所對應的索引值---列索引
        int idIndex=cursor.getColumnIndex(COLUMNS[0]);
        //獲取NAME所對應的索引值---列索引
        int displayNameIndex=cursor.getColumnIndex(COLUMNS[1]);
        List<String> items=new ArrayList<String>();
        for(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext()){
            int id=cursor.getInt(idIndex);
            String name=cursor.getString(displayNameIndex);
            items.add("id="+id+"\t 姓名= "+name);
        }
        ArrayAdapter<String> adapter=new ArrayAdapter<String>(Content_Provider_Activity.this,
                R.layout.list_item,items);
        listView.setAdapter(adapter);
    }
    public class MyButton implements OnClickListener{
 
        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            switch (arg0.getId()) {
            case R.id.button:
                getNameAndPhone();
                break;
                 
            default:
                break;
            }
        }
    }
    public void getNameAndPhone(){
        @SuppressWarnings("deprecation")
        <a title="Cursor" href=" http://www.android-study.com/jichuzhishi/547.html">Cursor</a> cursor=managedQuery(Contacts.CONTENT_URI, COLUMNS2, null, null, null);
        int displayNameIndex=cursor.getColumnIndex(COLUMNS2[0]);
        List<String> items=new ArrayList<String>();
        for(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext()){
            String name=cursor.getString(displayNameIndex);
            int id=cursor.getInt(cursor.getColumnIndex(COLUMNS2[1]));
            @SuppressWarnings("deprecation")
            <a title="Cursor" href=" http://www.android-study.com/jichuzhishi/547.html">Cursor</a> phone=managedQuery(Phone.CONTENT_URI, null, Phone.CONTACT_ID+" = "+id,
                    null, null);
            while(phone.moveToNext()){
                String phoneNumber=phone.getString(phone.getColumnIndex(COLUMNS3[0]));
                items.add("姓名:"+name+"\t 手機:"+phoneNumber);
            }
        }
        ArrayAdapter<String> adapter=new ArrayAdapter<String>(Content_Provider_Activity.this,
                R.layout.list_item ,items);
        listView2.setAdapter(adapter);
    }

} html

轉載自:http://www.android-study.com/jichuzhishi/547.html android

相關文章
相關標籤/搜索