安卓核心组件内容提供者(Content Provider)提供了对外部数据进行增、删、改、查的功能。实际上,它就相当于跨应用的数据操作,也可以看作是操作数据库的代理。
Content Provider相当于数据的接口,通过它可以将程序内部使用的数据向其它程序公开,这样其它程序就可以通过Context.getContentResolver方法获得ContentResolver对象,并使用该对象提供的insert、delete、update、query方法对程序内部的数据进行增、删、改、查操作。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android1="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/background"
android:orientation="vertical">
<ListView
android:id="@+id/lvContact"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp" >
<TextView
android:id="@+id/tvContactName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#0000ff"
android:textSize="20sp" />
<TextView
android:id="@+id/tvContactPhone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:textColor="#555555"
android:textSize="15sp" />
LinearLayout>
package net.hw.display_contacts;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private ListView lvContact; // 联系人列表控件
private SimpleCursorAdapter adapter; // 简单游标适配器
private Cursor cursor; // 游标
final private int REQUEST_CODE_ASK_PERMISSIONS = 123;
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 利用布局资源文件设置用户界面
setContentView(R.layout.activity_main);
// 通过资源标识符获取控件实例
lvContact = findViewById(R.id.lvContact);
// 删除全部联系人
deleteAllContacts();
// 添加若干联系人
addContact("李红玉", "15890903456", "[email protected]");
addContact("石破天", "13945667788", "[email protected]");
addContact("费玉清", "15867788965", "[email protected]");
addContact("郑智化", "15823232324", "[email protected]");
addContact("张曼玉", "13990903678", "[email protected]");
addContact("林青霞", "18590903242", "[email protected]");
addContact("钟楚红", "15994543543", "[email protected]");
// 通过内容解析者获取联系人游标
cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null, null, null, null);
// 创建简单游标适配器
adapter = new SimpleCursorAdapter(this, R.layout.contact_list_item, cursor,
new String[]{
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER},
new int[]{
R.id.tvContactName, R.id.tvContactPhone},
SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
// 给列表控件设置适配器
lvContact.setAdapter(adapter);
}
/**
* 添加联系人
*
* @param name
* @param phone
* @param email
*/
private void addContact(String name, String phone, String email) {
// 获取内容解析者
ContentResolver resolver = getContentResolver();
// 获取raw_contacts表的uri
Uri rawContactsUri = Uri.parse("content://com.android.contacts/raw_contacts");
// 创建内容值对象
ContentValues values = new ContentValues();
// 往raw_contacts插入一条新记录,然后解析出它的id
long id = ContentUris.parseId(resolver.insert(rawContactsUri, values));
// 获取data表的uri
Uri dataUri = Uri.parse("content://com.android.contacts/data");
// 添加联系人姓名
values.put("raw_contact_id", id);
values.put("data2", name);
values.put("mimetype", "vnd.android.cursor.item/name");
resolver.insert(dataUri, values);
// 添加联系人电话
values.clear(); // 清空上一次的数据
values.put("raw_contact_id", id);
values.put("data1", phone);
values.put("data2", "2");
values.put("mimetype", "vnd.android.cursor.item/phone_v2");
resolver.insert(dataUri, values);
// 添加联系人邮箱
values.clear(); // 清空上一次的数据
values.put("raw_contact_id", id);
values.put("data1", email);
values.put("data2", "1");
values.put("mimetype", "vnd.android.cursor.item/email_v2");
resolver.insert(dataUri, values);
}
/**
* 删除所有联系人
*/
private void deleteAllContacts() {
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
getContentResolver().delete(uri, null, null);
uri = Uri.parse("content://com.android.contacts/data");
getContentResolver().delete(uri, null, null);
uri = Uri.parse("content://com.android.contacts/contacts");
getContentResolver().delete(uri, null, null);
}
}