8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
问题
Android如何获取通讯录中联系人的信息?
相关知识ContactsContract
ContentResolver
动态权限申请
一点SQL语法基础
正文
在Android中获取通讯录联系人信息其实比较简单,只要通过ContentResolver来查询相关URI的数据库表就可以了。
三张表
Android 将我们的联系人信息存储在三张表中,
因为Android系统中,可以登录多个帐户进行通讯录同步,所以一个联系人可能来自不同的帐号中,所以需要ContactsContract.RawContacts表记录,联系人信息中,那哪些信息来自哪个帐户,该记录什么时候进行的同步,同步下来后,是否发生过修改等信息,这些信息我们一般不需要关注。
三张表的关系
这三张表的关系用ER图表示:
了解了这个三个表的关系之后,获取所有联系人的信息的思路就明确了。
实际上,就是做这三个表的级联查询。
CommonDataKinds
除了上面三张表之外,这里还要了解一下ContactsContract.CommonDataKinds。
上文中三张表分别封装为对应的三个类,而CommonDataKinds封装的是这几个表中的某些列的别名。比如Data表中,数据存放在DATA1,DATA2,…, DATA15这几个列中,而CommonDataKinds.PHONE.NUMBER,实际就是指向了DATA1.
它存在的意义在于方便我们进行信息的提取。
代码添加相关权限
注: 该权限为危险,Android6.0以上需要进行动态申请
代码//kotlin
//获取所有联系人名字和Id
public fun getAllContacts(contentResolver: ContentResolver): List?{
val col = arrayOf(ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME_PRIMARY)
val cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI,
col, null, null, null)
if (cursor != null){
while (cursor.moveToNext()){
val id = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID))
val name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY))
Log.d(TAG, "nID = "+id+" name = "+name)
getRawContacts(contentResolver, id)
Log.d(TAG, "n----------------------------------------------")
}
cursor.close()
}
return null
}
//获取该联系人所有元数据
public fun getRawContacts(contentResolver: ContentResolver, contactId: Int){
val col = arrayOf(ContactsContract.RawContacts._ID,
ContactsContract.RawContacts.CONTACT_ID,
ContactsContract.RawContacts.ACCOUNT_NAME)
val cursor = contentResolver.query(ContactsContract.RawContacts.CONTENT_URI,
col, ContactsContract.RawContacts.CONTACT_ID+" = ?",
arrayOf(contactId.toString()), null)
if(cursor != null){
while (cursor.moveToNext()){
val id = cursor.getInt(cursor.getColumnIndex(col[0]))
val contact_id = cursor.getInt(cursor.getColumnIndex(col[1]))
val accountName = cursor.getInt(cursor.getColumnIndex(col[2]))
Log.d(TAG, "nID = "+id+" contactId = "+contact_id+" accountName = "+accountName)
getContactData(contentResolver, id)
}
cursor.close()
}
}
//获取该元数据对应用的数据
public fun getContactData(contentResolver: ContentResolver, rawContactId: Int){
val col = arrayOf(ContactsContract.Data._ID,
ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER)
val cursor = contentResolver.query(ContactsContract.Data.CONTENT_URI,
null, ContactsContract.Data.RAW_CONTACT_ID+" = ?",
arrayOf(rawContactId.toString()), null)
if(cursor != null){
while (cursor.moveToNext()){
val id = cursor.getInt(cursor.getColumnIndex(col[0]))
val name = cursor.getString(cursor.getColumnIndex(col[1]))
val number = cursor.getString(cursor.getColumnIndex(col[2]))
Log.d(TAG, "nDataId = "+id+" name = "+name+" number = "+number)
}
cursor.close()
}
}
除此之外,google还提供给 ContactsContract.Contacts.Entity,方便我们通过联系人Id查询对应的信息实体,避免多次查询表,然而我试了一下,在我的机器上没有成功。
参考