android ContentResolver的使用(獲取和修改聯絡人資訊demo)

許佳佳233發表於2016-04-07

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

 

 

 

 

 

相關文章