1. 程式人生 > >【達內課程】聯絡人專案(知識預熱)

【達內課程】聯絡人專案(知識預熱)

聯絡人表結構

首先在模擬機中新增幾個聯絡人
在這裡插入圖片描述

然後開啟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;
    }
}

執行結果
在這裡插入圖片描述