第六天(上)
contentProvider
運用contentProvider訪問聯繫人—Button1
contentProvider添加聯繫人—Button2
package com.xiaogao.user.android2lesson_06_systemcontentprovider;
public class MainActivity extends AppCompatActivity {
/**
* 調用系統提供的contentProvider
* 今天已獲取聯繫人爲例
* 系統在寫聯繫人這個APP的時候,就已經提供好了一個聯繫人的contentProvider
* 看一下系統提供的聯繫人數據庫
* <p/>
* 源碼裏面都有,我們看截圖
* raw_contacts表
* contact_id 存放聯繫人的id
* <p/>
* data表
* 這個表是用來存儲所有聯繫人的詳細信息的
* 一個聯繫人的信息可能分爲多條數據
* 其中比較重要的字段是數據類型,聯繫人id,還有數據內容
* <p/>
* 其中有一個字段mime_type是數據的類型,(電話、郵箱、名字等)
* <p/>
* mime_type表
* 就是聯繫人所有的數據類型選項
* <p/>
* 看源碼可以看出contentProvider有兩個Uri,兩個都是可以用的,但是,在4.0之後,只能使用分好後面的Uri,該路徑是
* <p/>
* <p/>
* 如果要獲取聯繫人的數據,怎麼做?
* 1、獲取所有人的聯繫id
* 2、根據id查詢到這個聯繫人
*/
private Button getContects;
private Button setContects;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getContects = (Button) findViewById(R.id.main_getContects);
setContects = (Button) findViewById(R.id.main_setContects);
getContects.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//在這裏進行聯繫人的獲取
ContentResolver cr = getContentResolver();
//1.獲取所有聯繫人的id
Cursor cursorID = cr.query(Uri.parse("content://com.android.contacts/raw_contacts"), new String[]{"contact_id"}, null, null, null);
if (cursorID.getCount() == 0) {
Toast.makeText(MainActivity.this, "沒有聯繫人", Toast.LENGTH_SHORT).show();
return;
}
//2.根據id獲取到每一個聯繫人的所有信息
while (cursorID.moveToNext()) {
//拿到id的字符串
String contactid = cursorID.getString(cursorID.getColumnIndex("contact_id"));
//根據id去data數據庫裏查詢聯繫人的所有信息
Cursor contactData = cr.query(Uri.parse("content://com.android.contacts/data"), new String[]{"data1", "mimetype"}, "raw_contact_id=?", new String[]{contactid}, null);
//遍歷獲取聯繫人信息
while (contactData.moveToNext()) {
//拿到數據內容
String data1 = contactData.getString(contactData.getColumnIndex("data1"));
//拿到數據類型
String mimetype = contactData.getString(contactData.getColumnIndex("mimetype"));
if ("vnd.android.cursor.item/email_v2".equals(mimetype)) {
Log.i("郵箱", data1);
} else if ("vnd.android.cursor.item/phone_v2".equals(mimetype)) {
Log.i("手機:", data1);
} else if ("vnd.android.cursor.item/name".equals(mimetype)) {
Log.i("名字:", data1);
}
}
//關閉遊標對象,釋放內存
contactData.close();
}
//關閉遊標對象,釋放內存
cursorID.close();
//3.添加權限,允許讀取ContentProvider
}
});
給系統添加聯繫人
/**
* 插入聯繫人
*
*/
setContects.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
/*通過上面分析,我們想要插入聯繫人,就需要如下的操作:
1、先去 raw_contacts 表中添加 id;
2、然後藉助 id 去 data 表中添加各種信息。
*/
ContentResolver cr = getContentResolver();
//先查詢 raw_contacts 表,獲取最新聯繫人的主鍵,然後主鍵+1,就是要插入的聯繫人的 id
Cursor cursorId = cr.query(Uri.parse("content://com.android.contacts/raw_contacts"),
new String[]{"_id"}, null, null, null);
//默認聯繫人 id 就是 1
int contact_id = 1;
if (cursorId.moveToLast()) {
//拿到主鍵
int _id = cursorId.getInt(cursorId.getColumnIndex("_id")); //主鍵+1,就是要插入的聯繫人
contact_id = ++_id;
}
//把 contact_id 添加到 raw_contacts 表中
ContentValues values = new ContentValues();
values.put("contact_id", contact_id);
cr.insert(Uri.parse("content://com.android.contacts/raw_contacts"), values);
//清空 ContentValues 插入姓名
values.clear();
values.put("data1", "小明");
values.put("mimetype", "vnd.android.cursor.item/name");
values.put("raw_contact_id", contact_id);
cr.insert(Uri.parse("content://com.android.contacts/data"), values);
//清空 ContentValues 插入電話
values.clear();
values.put("data1", "7966888");
values.put("mimetype", "vnd.android.cursor.item/phone_v2");
values.put("raw_contact_id", contact_id);
cr.insert(Uri.parse("content://com.android.contacts/data"), values);
//清空 ContentValues 插入郵箱
values.clear();
values.put("data1","[email protected]");
values.put("mimetype","vnd.android.cursor.item/email_v2");
values.put("raw_contact_id",contact_id);
cr.insert(Uri.parse("content://com.android.contacts/data"), values);
cursorId.close();
ContentResolver cr1 = getContentResolver();
//先查詢 raw_contacts 表,獲取最新聯繫人的主鍵,然後主鍵+1,就是要插入的聯繫人的 id
Cursor cursorId1 = cr1.query(Uri.parse("content://com.android.contacts/raw_contacts"),
new String[]{"_id"}, null, null, null);
int contact_sid = 2;
if (cursorId1.moveToLast()) {
//拿到主鍵
int _id = cursorId1.getInt(cursorId1.getColumnIndex("_id")); //主鍵+1,就是要插入的聯繫人
contact_sid = ++_id;
}
//把 contact_id 添加到 raw_contacts 表中
ContentValues values1 = new ContentValues();
values1.put("contact_id", contact_sid);
cr1.insert(Uri.parse("content://com.android.contacts/raw_contacts"), values1);
//清空 ContentValues 插入姓名
values1.clear();
values1.put("data1", "小紅");
values1.put("mimetype", "vnd.android.cursor.item/name");
values1.put("raw_contact_id", contact_sid);
cr1.insert(Uri.parse("content://com.android.contacts/data"), values1);
//清空 ContentValues 插入電話
values1.clear();
values1.put("data1", "7966999");
values1.put("mimetype", "vnd.android.cursor.item/phone_v2");
values1.put("raw_contact_id", contact_sid);
cr1.insert(Uri.parse("content://com.android.contacts/data"), values1);
//清空 ContentValues 插入郵箱
values1.clear();
values1.put("data1","[email protected]");
values1.put("mimetype","vnd.android.cursor.item/email_v2");
values1.put("raw_contact_id",contact_sid);
cr1.insert(Uri.parse("content://com.android.contacts/data"), values1);
cursorId1.close();
Toast.makeText(MainActivity.this, "插入聯繫人成功", Toast.LENGTH_SHORT).show();
;
}
});
}
}
注意:記住加權限在Manifest.xml
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>