android ContentResolver的使用(獲取和修改聯絡人資訊demo)
ContentProvider和ContentResolver永遠是相對的,本章主要是講ContentResolver的使用,當然是在android系統提供ContentProvider的情況下。
ContentProvider與ContentResolver概念上的東西的就不講了,主要講一下ContentResolver的作用以及使用方法。
ContentResolver的作用:
1、可以通過ContentResolver來獲取android內部的資料,比如聯絡人資訊、系統的多媒體資訊、簡訊資訊等等。
2、可以獲取提供了ContentProvider的應用的資料。
ContentResolver的使用方法:(參考《瘋狂Android講義第三版》446面)
1、呼叫Context的getContentResolver()獲取ContentResolver物件。
2、根據需要呼叫ContentResolver的insert(),delete(),updata(),query方法運算元據庫。
3、為了作業系統提供的ContentResolver,需要了解該ContentProvider的Uri,以及該ContentProvider所操作的資料列的列名,可以通過查閱Android官方文件來獲取這些資訊。
4、使用時牢記不要忘記在AndroidManifest中新增許可權,並且要及時close掉curcor。
筆者個人意見:
1、建議新手讀者在學完SqLite之後再來學習ContentResolver的內容,ContentResolver的insert(),delete(),updata(),query四個運算元據庫的方法均與SQLite中的相同。
2、ContentProvider的Uri,以及該ContentProvider所操作的資料列的列名都不需要死記硬背,需要用的時候查閱一下即可,新手此處最好能自己全部寫一下,對ContentResolver的使用有一個總體的瞭解。
筆者demo效果:(原始碼在文章結尾)
程式碼截圖:
在demo中用到的ContentProvider的兩個Uri如下:
管理聯絡人的Uri。
ContactsContract.Contacts.CONTENT_URI
管理聯絡人電話的Uri。
ContactsContract.CommonDataKinds.Phone.CONTENT_URI
AndroidManifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.double2.mcontentprovider">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ShowActivity"/>
</application>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
</manifest>
MainActivity:
package com.example.double2.mcontentprovider;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button btnShow;
private Button btnAdd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnShow=(Button)findViewById(R.id.btn_show);
//點選後跳轉到ShowActivity
btnShow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ToShowActivity();
}
});
btnAdd=(Button)findViewById(R.id.btn_add);
//點選後跳出新增資訊的dialog
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showAddDialog();
}
});
}
private void showAddDialog() {
View dialog_add=getLayoutInflater().inflate(R.layout.dialog_add, null);
final EditText etName=(EditText)dialog_add.findViewById(R.id.et_name);
final EditText etPhone=(EditText)dialog_add.findViewById(R.id.et_phone);
//初始化dialog
AlertDialog.Builder dialog=new AlertDialog.Builder(MainActivity.this);
dialog.setTitle("新增聯絡人")
.setView(dialog_add)
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String mName=etName.getText().toString();
String mPhone=etPhone.getText().toString();
if(mName.equals("")||mPhone.equals(""))
Toast.makeText(MainActivity.this, "聯絡人姓名或電話不能為空", Toast.LENGTH_SHORT).show();
else
addMyContact(mName,mPhone);
}
})
.setNegativeButton("取消",null)
.create()
.show();
}
private void addMyContact(String mName, String mPhone) {
//建立一個空的ContentValues
ContentValues values=new ContentValues();
//向ContactsContract.RawContacts.CONTENT_URI執行一個空值插入
//目的是獲取系統返貨的rawContactId,以便新增聯絡人名字和電話使用同一個id
Uri rawContactUri=getContentResolver().insert(
ContactsContract.RawContacts.CONTENT_URI,values);
long rawContactId= ContentUris.parseId(rawContactUri);
//清空values
//設定id
//設定內容型別
//設定聯絡人姓名
values.clear();
values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
values.put(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, mName);
//向聯絡人URI新增聯絡人姓名
getContentResolver().insert(ContactsContract.Data.CONTENT_URI,values);
//清空values
//設定id
//設定內容型別
//設定聯絡人電話
//設定電話型別
values.clear();
values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
values.put(ContactsContract.CommonDataKinds.Phone.NUMBER,mPhone);
values.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE);
getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
//使用toast提示使用者資訊新增成功
Toast.makeText(MainActivity.this, "聯絡人資料新增成功!", Toast.LENGTH_SHORT).show();
}
private void ToShowActivity() {
Intent intent=new Intent(MainActivity.this,ShowActivity.class);
startActivity(intent);
}
}
ShowActivity:
package com.example.double2.mcontentprovider;
import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by Double2號 on 2016/4/6.
*/
public class ShowActivity extends Activity {
ListView lvContacts;
List<Map<String,String>> mListItems;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show);
lvContacts=(ListView)findViewById(R.id.lv_contacts);
//此處主要思路是獲取聯絡人的姓名和電話存入mListItems
//然後通過mListItems建立SimpleAdapter
mListItems=new ArrayList<Map<String,String>>();
getContactsData();
SimpleAdapter mSimpleAdapter=new SimpleAdapter(this,mListItems,R.layout.item_list,
new String[]{"name","phone"},
new int[]{R.id.tv_item_name,R.id.tv_item_phone});
lvContacts.setAdapter(mSimpleAdapter);
}
public void getContactsData() {
//使用ContentResolver查詢聯絡人資料
Cursor cursor=getContentResolver().query(
ContactsContract.Contacts.CONTENT_URI,null,null, null,null);
//便利查詢結果,獲取系統中的所有人
while (cursor.moveToNext()){
//獲取聯絡人id
String contactId=cursor.getString(cursor.getColumnIndex(
ContactsContract.Contacts._ID));
Log.i("xujiajia",contactId);
//獲取聯絡人姓名
String name=cursor.getString(cursor.getColumnIndex(
ContactsContract.Contacts.DISPLAY_NAME));
Log.i("xujiajia", name);
//使用過ContentResolver通過id查詢聯絡人的電話
//此處為了方便顯示,只取聯絡人的第一個號碼(可能有多個號碼)
Cursor phones=getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId
, null, null);
phones.moveToNext();
String phone=phones.getString(phones.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.NUMBER));
Log.i("xujiajia", phone);
//使用完畢關閉Cursor
phones.close();
//建立Map新增到mListItems中用於建立SimpleAdapter
Map<String,String> listItem=new HashMap<String,String>();
listItem.put("name",name);
listItem.put("phone",phone);
mListItems.add(listItem);
}
//使用完畢關閉Cursor
cursor.close();
}
}
activity_main:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
>
<Button
android:id="@+id/btn_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="檢視聯絡人"
/>
<Button
android:id="@+id/btn_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="新增聯絡人" />
</LinearLayout>
activity_show:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/lv_contacts"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
dialog_add:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp">
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="聯絡人姓名:" />
<EditText
android:id="@+id/et_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" />
</TableRow>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="聯絡人電話:" />
<EditText
android:id="@+id/et_phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" />
</TableRow>
</TableLayout>
item_list:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
android:orientation="vertical">
<TextView
android:id="@+id/tv_item_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:text="聯絡人姓名"
android:textSize="20sp"/>
<TextView
android:id="@+id/tv_item_phone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:text="聯絡人電話"
android:textSize="20sp"/>
</LinearLayout>
原始碼地址:http://download.csdn.net/detail/double2hao/9483388
相關文章
- android 從SIM卡獲取聯絡人資訊Android
- iOS獲取通訊錄聯絡人資訊iOS
- 使用curl獲取google聯絡人列表 (向zend的Gdata say no)Go
- Android在到處.vcf聯絡人時,vCard獲取不到版本號Android
- 跨程式共享資料,讀取聯絡人資訊
- Android獲取聯絡人和電話號碼Android
- Android獲取手機聯絡人匹配使用者表並按字母A Z排序展示Android排序
- Android2.0 如何設定和讀取聯絡人的分組(Group)Android
- 影片直播系統原始碼,Android 讀取聯絡人列表原始碼Android
- Android訪問和載入本地聯絡人的程式碼實現Android
- UIWebView簡單的獲取HTML內容和修改頁面資訊UIWebViewHTML
- Android系統資訊獲取Android
- CRM系統中的聯絡人是什麼?如何進行聯絡人管理?
- iOSContactsUI(聯絡人)iOSUI
- Android獲取應用基本資訊Android
- Android獲取手機配置資訊Android
- android GPS 獲取城市資訊Android
- Android中獲取應用程式(包)的資訊-----PackageManager的使用(一)AndroidPackage
- 通訊錄檔案中存有若干聯絡人的資訊,每個聯絡人的資訊由姓名和電話號碼組成。編寫程式完成以下功能:輸入姓名,若通訊錄檔案中存在,則將該聯絡人資訊輸出;若不存在,則輸出“Not Found”。
- 關於模型關聯 獲取不到關聯資訊 求教模型
- 使用python uiautomation從釘釘網頁版提取公司所有聯絡人資訊PythonUI網頁
- Mac使用教程_如何合併和刪除macOS和iCloud中重複的聯絡人?MacCloud
- 蘋果iphone XS匯入聯絡人的方法 iphone XS怎麼批次匯入聯絡人?蘋果iPhone
- Android中獲取系統記憶體資訊以及程式資訊-----ActivityManager的使用(一)Android記憶體
- 使用和風天氣介面獲取天氣資訊
- Android KK臺,聯絡人列表#集團放置A~Z之前Android
- Hover獲取Android使用者輸入的機密資訊(一)Android
- Hover獲取Android使用者輸入的機密資訊(二)Android
- OPPO手機緊急聯絡人設定使用教程 OPPO手機怎麼設定緊急聯絡人
- 奇酷手機怎麼合併和拆分聯絡人 奇酷手機怎麼合併和拆分聯絡人教程
- 網站聯絡人更改操作網站
- Android獲取硬體裝置資訊Android
- Android中獲取當前位置資訊Android
- [Android]獲取整體APP CPU資訊AndroidAPP
- win10 如何匯入人脈聯絡人_win10人脈怎麼匯入聯絡人Win10
- Oracle獲取所有表名資訊和獲取指定表名欄位資訊Oracle
- 登入介面:從資料庫中獲取資訊驗證登入(與註冊介面相聯絡)資料庫
- iPhone緊急聯絡人設定教程 iPhone怎麼設定緊急聯絡人?iPhone