Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android小項目之--應用解析 Content Provider->內容提供商(附源碼)

Android小項目之--應用解析 Content Provider->內容提供商(附源碼)

編輯:Android開發實例

  上篇 SQLite 的文章講述了 Andriod 系統的數據庫存儲讀寫,本篇將深入解析在 Android系統中如何共享不同應用的數據。

 

為什麼需要 Content Provider?

 

  在 Android 中,每一個應用都運行在各自的進程中,當一個應用需要返問其他應用的數據時,也就是需要數據在不同的虛擬機之間傳遞,這樣的情況操作起來可能有些困難,所以 Google 引入了 Content Provider (內容提供商)來解決在不同的應用包之間的數據共享。

 

什麼是 Content Provider?

 

  Content Provider,即內容提供商,再具體解釋就是:CP是移動數據業務內容提供商,或者叫移動增值業務內容提供商。它是一個類,這個類將它要共享的數據進行包裝,提供了一組供其他應用程序調用的接口方法,這些方法可以讓應用程序存儲和提取被包裝的數據。

 

了解 Content Provider

 

  在 Android 中,Content Provider 是一個特殊的存儲數據類型,它提供了一套標准的接口用來獲取和操作數據。並且,Android 自身也是提供了現在的 Content Provider: Contacts、Browser、CallLog、Settings、MediaStore。應用可以通過唯一的 Content Provider 界面來使用具體的某個 Content Provider,然後就可以調用 ContentResolver 提供的方法來使用你需要的 Content Provider了。

 

使用 Content Provider

  

  ContentResolver 提供了 query()、insert()、update()等來請求 Content Provider 。要使用這些方法,還會涉及URI。URI是一個String形式的 Content Provider 的完全路徑。

  本篇例子,使用Content Provider實現了獲取聯系人信息然後展示的操作,先來看一下運行效果:

 

圖1為本地的所有聯系人電話清單

 

圖2 為加載的時候獲取聯系人的信息 代碼實現: package com.terry;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.PhoneLookup;
import android.webkit.WebChromeClient.CustomViewCallback;
import android.widget.TextView;

public class testActivity extends Activity {
     String text="";
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        
        TextView tv=(TextView)findViewById(R.id.TextView01);
       
        
        ContentResolver cr=getContentResolver();
        Cursor cursor=cr.query(ContactsContract.Contacts.CONTENT_URI,
                null, null, null, null);
        int nameIndex=0;
        String ContactName="";
        String contactId=""; 
        Cursor phone;
        String phoneNumber="";
        int phoneIndex;
        while(cursor.moveToNext())
        {
            //取得名稱所在的索引
             nameIndex=cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME);
            //通過所在索引取得聯系人的名稱
             ContactName=cursor.getString(nameIndex);
            
            //取得電話號碼所在索引
//             numberIndex=cursor.getColumnIndex(PhoneLookup.NUMBER);
//            String number=cursor.getString(numberIndex);
             
            
            //獲取聯系人的ID號,在SQLite中的數據庫ID
             contactId=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
             phone=cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                    null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID "=" contactId,
                    null, null);
             
             while (phone.moveToNext()) {
                 
                  phoneIndex=phone.getColumnIndex(ContactsContract
                         .CommonDataKinds.Phone.NUMBER );
                 phoneNumber=phone.getString(phoneIndex);
            }
            
            
            text =(ContactName ":" phoneNumber "\n");
            
        }
        cursor.close();
        tv.setText(text);
    }
}

  注意:此例子使用版本為:2.2如果你使用的是2.0以下版本上面代碼標記紅色的兩段代碼是可行的。即獲得電話號碼,但在2.0之後版本API就改了,如果你用2.2版本使用上面紅色代碼運行將會報錯。使用方法不是簡單的像使用獲取名稱一樣簡單。而是要通過到數據庫中查找而獲得,因為電話號碼可能不止一個,這可能也是Google 修復的一個bug。。所以在此建議如上寫法。

  讀取聯系人API同樣需要聲明權限,權限代碼如下:

<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>

 

 

  現在著重講述一下query這個方法,Content Provider 提供的虛函數 query方法必須返回一個能夠遍歷所求數據的Cursor對象,Cursor本身也是接口,但是Android一些可用的Cursor對象,例如,SQLiteCursor可以遍歷保存在SQLite 數據庫中的數據,通過調用SQLiteDatabase類的query方法就可以得到Cursor對象,還有其它不是保存在數據庫中的數據而設的Cursor實現,諸如MatrixCursor。由於在不同的進程和線程中的ContentResolver 對象都可以調用Content Provider 的方法,必須在線程安全模式下使用。     上面簡單的介紹了使用 Conent Provider 獲取數據的一個經典案例,更加詳細的使用方法請參閱有關書籍。   由於工程中有另外的例子,體積稍大傳不上來,有需要的可以email我,謝謝。   如果你有什麼疑問或者建議:Email:[email protected]
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved