使用ContentResolver操作ContentProvider中的數據

當外部應用需要對ContentProvider中的數據進行添加、刪除、修改和查詢操作時,可以使用ContentResolver 類來完成,要獲取ContentResolver 對象,可以使用Activity提供的getContentResolver()方法。 ContentResolver 類提供了與ContentProvider類相同簽名的四個方法:

public Uri insert(Uri uri, ContentValues values)
該方法用於往ContentProvider添加數據。
public int delete(Uri uri, String selection, String[] selectionArgs)
該方法用於從ContentProvider刪除數據。
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
該方法用於更新ContentProvider中的數據。

public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
該方法用於從ContentProvider中獲取數據。

這些方法的第一個參數爲Uri,代表要操作的ContentProvider和對其中的什麼數據進行操作,假設給定的是: Uri.parse(“content://cn.itcast.providers.personprovider/person/10”),那麼將會對主機名爲cn.itcast.providers.personprovider的ContentProvider進行操作,操作的數據爲person表中id爲10的記錄。

使用ContentResolver對ContentProvider中的數據進行添加、刪除、修改和查詢操作:
ContentResolver resolver =  getContentResolver();
Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person");
//添加一條記錄
ContentValues values = new ContentValues();
values.put("name", "itcast");
values.put("age", 25);
resolver.insert(uri, values);

//獲取person表中所有記錄
Cursor cursor = resolver.query(uri, null, null, null, "personid desc");
while(cursor.moveToNext()){
Log.i("ContentTest", "personid="+ cursor.getInt(0)+ ",name="+ cursor.getString(1));
}

//把id爲1的記錄的name字段值更改新爲liming
ContentValues updateValues = new ContentValues();
updateValues.put("name", "liming");
Uri updateIdUri = ContentUris.withAppendedId(uri, 2);
resolver.update(updateIdUri, updateValues, null, null);

//刪除id爲2的記錄
Uri deleteIdUri = ContentUris.withAppendedId(uri, 2);
resolver.delete(deleteIdUri, null, null);

如果ContentProvider的訪問者需要得知ContentProvider中的數據發生了變化,可以在ContentProvider 發生數據變化時調用getContentResolver().notifyChange(uri, null)來通知註冊在此URI上的訪問者,例子如下:

public class PersonContentProvider extends ContentProvider {
public Uri insert(Uri uri, ContentValues values) {
db.insert("person", "personid", values);
getContext().getContentResolver().notifyChange(uri, null);
}
}

如果ContentProvider的訪問者需要得到數據變化通知,必須使用ContentObserver對數據(數據採用uri描述)進行監聽,當監聽到數據變化通知時,系統就會調用ContentObserver的onChange()方法:

getContentResolver().registerContentObserver(Uri.parse("content://cn.itcast.providers.personprovider/person"),
        true, new PersonObserver(new Handler()));
public class PersonObserver extends ContentObserver{
public PersonObserver(Handler handler) {
super(handler);
  }
public void onChange(boolean selfChange) {
   //此處可以進行相應的業務處理
}
}

加入讀取聯繫人信息的權限
<uses-permission android:name="android.permission.READ_CONTACTS"/>


content://com.android.contacts/contacts 操作的數據是聯繫人信息Uri
content://com.android.contacts/data/phones 聯繫人電話Uri
content://com.android.contacts/data/emails 聯繫人Email Uri

 讀取聯繫人信息
Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,  null, null, null, null);  

while (cursor.moveToNext()) {  
   String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));  
   String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));  
   
   Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId, null, null);  

    while (phones.moveToNext()) {  
     String phoneNumber = phones.getString(phones.getColumnIndex(  
         ContactsContract.CommonDataKinds.Phone.NUMBER));  
      Log.i("RongActivity", "phoneNumber="+phoneNumber);
    }  
    phones.close();  

    Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,  
       null,  
       ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId,  
       null, null);  
       while (emails.moveToNext()) {  
        // This would allow you get several email addresses  
        String emailAddress = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
        Log.i("RongActivity", "emailAddress="+ emailAddress);
       }  
       emails.close();  

  }  
  cursor.close(); 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章