【達內課程】聯絡人專案(知識預熱)
阿新 • • 發佈:2018-12-05
聯絡人表結構
首先在模擬機中新增幾個聯絡人
然後開啟Device File Exploer
data-data-com.android.providers.contacts下的databases資料夾
把contacts2.db匯出,檢視contacts表、data表、mimetypes表
聯絡人的資訊操作前,必須把資料庫的這3個表仔細看一下
contacts表
data表
mimetypes表
栗子:查詢聯絡人資料
AndroidManifest.xml增加許可權
<uses-permission android:name="android.permission.READ_CONTACTS"/>
Contact類
public class Contact { private int id; private int photoId; private String name; private String email; private String phone; private String address; // 增加各個屬性的set和get方法 ...... @Override public String toString() { return "Contact id:"+id+",\nPhoto id:"+photoId+",\nName:"+name+",\nEmail:"+email+",\nPhone:"+phone+",\nAddress:"+address; } }
MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button btn_search; private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn_search = findViewById(R.id.btn_search); listView = findViewById(R.id.listview); btn_search.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.btn_search: List<Contact> list = loadContacts(); Log.d("CONTACT", list.toString()); ArrayAdapter<Contact> arrayAdapter = new ArrayAdapter<Contact>(this, android.R.layout.simple_list_item_1, list); listView.setAdapter(arrayAdapter); break; } } /** * 查詢聯絡人 * 先查contacts表,獲取所有人id * 再查data表,通過id查詢這個人的其他資訊 */ private List<Contact> loadContacts() { ContentResolver r = getContentResolver(); Uri uri = ContactsContract.Contacts.CONTENT_URI; String[] projection = { ContactsContract.Contacts._ID, ContactsContract.Contacts.PHOTO_ID }; String[] column = { ContactsContract.Data._ID,//0 ContactsContract.Data.MIMETYPE,//1 ContactsContract.Data.DATA1//2 }; Cursor c = r.query(uri, projection, null, null, null); //準備集合 List<Contact> contacts = new ArrayList<Contact>(); while (c.moveToNext()) { Contact contact = new Contact(); int id = c.getInt(0); int photo_id = c.getInt(1); contact.setId(id); contact.setPhotoId(photo_id); //通過id查data表,獲取這個人的其他資訊 Uri dataUri = ContactsContract.Data.CONTENT_URI; Cursor c1 = r.query(dataUri, column, ContactsContract.Data.RAW_CONTACT_ID + "=?", new String[]{id + ""}, null); while (c1.moveToNext()) { int dataId = c1.getInt(0); String mm = c1.getString(1); String data1 = c1.getString(2); //data表裡的欄位是mimetype_id,而這裡查詢的是mimetype,返回的是字串 //通過contentprovider查到的就是字串,拿不到id if (mm.equals(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)) { //描述的是Email contact.setEmail(data1); } else if (mm.equals(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)) { //描述的是Phone contact.setPhone(data1); } else if (mm.equals("vnd.android.cursor.item/name")) { //描述的是Name contact.setName(data1); } else if (mm.equals("vnd.android.cursor.item/sip_address")) { //描述的是Address contact.setAddress(data1); } } contacts.add(contact); c1.close(); } c.close(); return contacts; } }
執行結果