android – 如何使用一个查询搜索带地址的联系人(FORMATTED_ADDRESS)?

android – 如何使用一个查询搜索带地址的联系人(FORMATTED_ADDRESS)?,第1张

概述我尝试对用户联系人实施实时搜索,我想获取每个匹配联系人的姓名,缩略图和地址(如果有). 用户键入时正在运行实时搜索. 所以他输入了ma并将获得’martin’,’matthews’…… 他将继续垫子,只会看到’matthews’ 我尝试使用如下的单个查询来实现此目的,但我始终在FORMATTED_ADRESS字段中获取联系号码.我想我有一个JOIN问题,因为我在同一个查询中使用ContactsCo 我尝试对用户联系人实施实时搜索,我想获取每个匹配联系人的姓名,缩略图和地址(如果有).

用户键入时正在运行实时搜索.

所以他输入了ma并将获得’martin’,’matthews’……

他将继续垫子,只会看到’matthews’

我尝试使用如下的单个查询来实现此目的,但我始终在FORMATTED_ADRESS字段中获取联系号码.我想我有一个JOIN问题,因为我在同一个查询中使用ContactsContract.CommonDataKinds和ContactsContract.Contacts?

public static List<ContactModel> getContactsForquery(Context context,String query) {    String[] projection = new String[] {        ContactsContract.Contacts.disPLAY_name,Contacts.PHOTO_thumbnail_URI,ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS    };    Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;    String selection = ContactsContract.Contacts.disPLAY_name + " liKE '%" + query +  "%'";    Cursor cursor = context.getContentResolver().query(uri,projection,selection,null,null);    if (cursor.movetoFirst()) {        do {            String name = cursor.getString(0);            String thumbail = cursor.getString(1);            String formattedADress = cursor.getString(2);        }        while (cursor.movetoNext());    }

我实际上解决了我的问题

>查询Contacts._ID,Contacts.disPLAY_name
>使用Contacts._ID开始第二个查询,如下所示

Cursor detailCursor = context.getContentResolver().query(       ContactsContract.Data.CONTENT_URI,new String[]{           CommonDataKinds.StructuredPostal.STREET,CommonDataKinds.StructuredPostal.CITY,CommonDataKinds.StructuredPostal.POSTCODE       },ContactsContract.Data.CONTACT_ID + "=? AND "            + CommonDataKinds.StructuredPostal.MIMETYPE + "=?",new String[]{           String.valueOf(contactID),CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE       },null);

但这将为每个联系人启动第二个查询,这可能不是最好的方法.

所以我的最后一个问题是:是否可以使用第一个查询来完成这项工作?

解决方法 嗯,非常难过,没有人能够回答我的问题并抓住赏金点;-(

为了记录,这是我的工作示例.它解决了这个问题,但我仍然认为它会产生很大的负荷.在每个用户条目(afterTextchange)上,我调用getContactsDetailsquery,它首先获取所有用户的ID,其ID包含其名称(光标)中的查询,然后我为每个用户启动另一个查询(detailCursor)以获取地址.为了防止过载,我增加了一个限制..

public static List<SearchModel> getContactDetailsForquery(Context context,String query,int limit) {    final int CONTACT_ID_INDEX = 0;    final int CONTACT_name_INDEX = 1;    final int CONTACT_thumbnail_INDEX = 2;    //my custom model to hold my results    List<SearchModel> results = new ArrayList<SearchModel>();    final String[] selectUser = new String[]{        Contacts._ID,Contacts.disPLAY_name,Contacts.PHOTO_thumbnail_URI};    String selection = Contacts.disPLAY_name + " liKE ?";    String[] selectionArgs = new String[]{"%" + query + "%"};    String sortOrder = Contacts.disPLAY_name + " ASC";    Cursor cursor = context.getContentResolver().query(Contacts.CONTENT_URI,selectUser,selectionArgs,sortOrder,null);    int contactCounter = 0;    if (cursor != null && cursor.movetoFirst()) {        do {            String contactID = cursor.getString(CONTACT_ID_INDEX);            String displayname = cursor.getString(CONTACT_name_INDEX);            String thumbnail = cursor.getString(CONTACT_thumbnail_INDEX);            //get user details with user ID (this is the query i wanted to change in my question!!)            Cursor detailCursor = context.getContentResolver().query(ContactsContract.Data.CONTENT_URI,new String[]{                    CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS},ContactsContract.Data.CONTACT_ID + "=? AND " +                    CommonDataKinds.StructuredPostal.MIMETYPE + "=?",new String[]{String.valueOf(contactID),CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE},null);            if (detailCursor != null && detailCursor.movetoFirst()) {                //special case: user has several address,query all of them                do {                    String formattedAddress = detailCursor.getString(detailCursor.getColumnIndex(CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS));                    //user has serveral adress -> init model for each adress                    SearchModel contact = new SearchModel();                    results.add(contact);                    contactCounter++;                } while (detailCursor.movetoNext() && contactCounter < limit);            } else {                //user has no adress -> init model                SearchModel contact = new SearchModel();                results.add(contact);                contactCounter++;            }            detailCursor.close();        } while (cursor.movetoNext() && contactCounter < limit);    }    cursor.close();    return results;}
总结

以上是内存溢出为你收集整理的android – 如何使用一个查询搜索带地址的联系人(FORMATTED_ADDRESS)?全部内容,希望文章能够帮你解决android – 如何使用一个查询搜索带地址的联系人(FORMATTED_ADDRESS)?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1135680.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存