上周寫代碼出現(xiàn)了一個bug湃密,獲取通訊錄聯(lián)系人的時候嘶朱,總是不能夠獲取到只有名字蛾坯,沒有手機號的聯(lián)系人。頭疼了很久疏遏,記錄一下脉课。
我們都知道想要獲取通訊錄的所有聯(lián)系人救军,肯定是要從手機的本地數(shù)據(jù)庫拿數(shù)據(jù),于是就查了一下存通訊錄的表倘零,路徑是:/data/data/com.Android.providers.contacts/databases/contact2.db
拿出來之后用SQLiteSpy打開目錄結(jié)構(gòu)如下:
主要用到的是長方形框框里面的幾個表(橢圓形哪個表一會兒再說)
好了唱遭,開始查詢,正常的步驟是直接使用ContentResolver提供的query方法就行呈驶。
ContentResolvercontentResolver=context.getContentResolver();
CursorcontactInfoCursor=contentResolver.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);
參數(shù)一:聯(lián)系人uri地址
參數(shù)二:想要獲取的列數(shù)名稱
參數(shù)三:查詢條件
參數(shù)四:查詢條件補充
解釋一下拷泽,這個query語句有5個參數(shù),第一個是Android_SDK提供的通訊錄聯(lián)系人的URI袖瞻,指向的地址是:content://com.android.contacts/contacts這個表司致,可以打開看一下:
我在通訊錄里面存了三個聯(lián)系人,有一個是沒有手機號的聋迎,可以看出來這三個聯(lián)系人都在這個表里面脂矫。
之后就執(zhí)行cursor指針的一系列操作獲取想要的數(shù)據(jù)就可以,我就不多做贅述了霉晕,百度一下有很多庭再。
但是還有一個URI是這樣的:
CursorcontactInfoCursor=contentResolver.query(Phone.CONTENT_URI,null,null,null,null);
這個查詢語句里面的URI的地址是:content://com.android.contacts/data/phones
導出的數(shù)據(jù)庫中沒有phones這個表,猜測可能是用has_number那一列去區(qū)別了一下聯(lián)系人牺堰,所以這個URI查詢出來的數(shù)據(jù)都有手機號拄轻,也就是如果存了一個聯(lián)系人沒有存手機號的話,用這個URI是查不出來的?