2023年6月27日发(作者:)
Android快速查询通讯录联系⼈前⾔查询联系⼈第⼀个需要先了解联系⼈的⼏个表关系和表字段不清楚的可以参照Android Developer关于联系⼈提供者(可能要翻墙)官⽅⽂档介绍或者参考 Android联系⼈模块分析(⼆) 做参考,不做过多介绍。需要查询联系⼈数据⽹上⼤部分都是说1. 查询ts原始联系⼈列表2. 通过原始联系⼈列表拿到的联系⼈id或者raw_contact_id查询联系⼈数据表获取到原始联系⼈详细信息(例如电⼦邮件地址或电话号码)⼤致代码如下 /** * 查询联系⼈数据 * @param context Context * @return JSONArray */ fun queryContactData(context: Context): JSONArray { val jsonArray = JSONArray() val cursorContacts = ( T_URI, arrayOf(ts._ID), null, null, null ) cursorContacts?.run { while (moveToNext()) { val id = ingOrNull(getColumnIndex(ts._ID)) val cursorData = ( T_URI, null, T_ID + " = ?", arrayOf(id), null ) cursorData?.run { //联系⼈名字 val name = JSONObject() //联系⼈下的电话 val phoneArray = JSONArray() while (moveToNext()) { when (ingOrNull(getColumnIndex(PE))) { //添加名字 T_ITEM_TYPE -> { { put( "display_name", ingOrNull( getColumnIndex( Y_NAME ) ) ) put( "given_name", ingOrNull( getColumnIndex( _NAME ) ) ) ) put( "family_name", ingOrNull( getColumnIndex( _NAME ) ) ) put( "prefix", ingOrNull( getColumnIndex( ) ) ) put( "middle_name", ingOrNull( getColumnIndex( _NAME ) ) ) put( "suffix", ingOrNull( getColumnIndex( ) ) ) } } //添加电话 T_ITEM_TYPE -> { JSONObject().apply { put( "number", ingOrNull(getColumnIndex()) ) put( "type", OrNull(getColumnIndex()) ) (this) } } //TODO("获取联系⼈其他详情数据") } } close() } } close() } JSONObject().apply { put("name", name) put("phone", phoneArray) (this) } return jsonArray }可以看到由于会查询两个表必定会影响查询速度,本⼈测试查询1163个联系⼈耗时平均⼤约在30秒左右正⽂由上⾯可以看出查询耗时主要在联表查询,其实我们需要的只是联系⼈详情数据故⽽可以换⼀种查询⽅式只查询表 /** * 查询联系⼈数据 * @param context Context */ fun queryContactData(context: Context) { val cursorData = ( T_URI, null, null, null, null ) cursorData?.run { while (moveToNext()) { cursorData TODO("获取联系⼈详情数据") } close() } }这样就会单独只查询表,但是当你这样查询会发现⼀个问题出现了很多同⼀个联系⼈的数据,如果你有查看官⽅⽂档的联系⼈表关系就会发现表对应的是联系⼈表的信息⾏,也就是⽐如⼀个⼿机号对应就是⼀个表,所以会出现很多需要整理的信息接下来就是需要整理获取到的联系⼈表信息,我们需要把信息添加到同⼀个联系⼈中1. 可以给()查询语句添加排序让查询结果按raw_contact_id升序排序2. 在游标cursorData返回中获取联系⼈的raw_contact_id 记录下来3. 判断记录下来的raw_contact_id和上⼀次的raw_contact_id是否⼀样,⼀样说明是同⼀个联系⼈数据将数据添加到联系⼈数据对象中,不相同则创建⼀个新的联系⼈数据对象并将从游标cursorData获取到的联系⼈数据加⼊当然为了加快查询速度可以为()查询语句添加查询指定数据这样会减少查询时间以下是完整代码 private var name: JSONObject? = null private var phoneArray: JSONArray? = null /** * 查询联系⼈数据 * @param context Context */ fun queryContactData(context: Context): JSONArray { val jsonArray = JSONArray() //记录raw_contact_id var rawContactIdOld = "" val cursorData = ( T_URI, arrayOf( _CONTACT_ID, PE, 1, 2, 3, 4, 5, 5, 6, ), null, null, "${_CONTACT_ID} ASC"//按raw_contact_id升序排序 ) cursorData?.run { while (moveToNext()) { //获取当前的联系⼈raw_contact_id val rawContactId = ingOrNull(getColumnIndex(_CONTACT_ID)) : "" if (rawContactId != rawContactIdOld) {//判断当前的和上⼀次的raw_contact_id是否⼀样,不⼀样说明不是同⼀个联系⼈数据 if (mpty()) { //添加联系⼈到数据中 addContactJSONArray(jsonArray) } name = JSONObject() phoneArray = JSONArray() rawContactIdOld = rawContactId } when (ingOrNull(getColumnIndex(PE))) { //添加名字 T_ITEM_TYPE -> { tryCatch { name?.apply { put( "display_name", ingOrNull(getColumnIndex(Y_NAME)) ) put( "given_name", ingOrNull(getColumnIndex(_NAME)) ) put( "family_name", ingOrNull(getColumnIndex(_NAME)) ) put( "prefix", ingOrNull(getColumnIndex()) ) put( "middle_name", ingOrNull(getColumnIndex(_NAME)) ) put( "suffix", ingOrNull(getColumnIndex()) ) } } } //添加电话号码 T_ITEM_TYPE -> { tryCatch { JSONObject().apply { put( "number", ingOrNull(getColumnIndex(1)) ) put( "type", OrNull(getColumnIndex(2)) ) phoneArray?.put(this) } } } } } if () { //添加联系⼈到数据中 addContactJSONArray(jsonArray) } } close() } return jsonArray } /** * 添加联系⼈到数据中 * @param jsonArray JSONArray */ private fun addContactJSONArray(jsonArray: JSONArray) { JSONObject().apply { put("name", name) put("phone", phoneArray) (this) } }最终⾃⼰测试查询1163个联系⼈耗时平均⼤约在750毫秒左右
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1687841089a49912.html
评论列表(0条)