我尝试对用户联系人实施实时搜索,我想获取每个匹配联系人的姓名,缩略图和地址(如果有).

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

所以他输入了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)?的更多相关文章

  1. Swift iOS 9通讯录访问

    viewmode=list我的stackoverflow前言:在iOS9之前,一直使用AddressBook这个framework来访问用户通讯录。

  2. [Swift] Enum 好用, Enum 可以更易用

    只需要写少量的几行声明:如下.选中,右键,选择"Services|generate_enum"然后如下代码就自动生成了:怎么样?当然还有其他选项可以使用.如果你有其他需要麻烦告诉我.当然有PR最好了.最后来张动图感受一下:代码在:OSCGitGithub

  3. swift – 交换机:枚举交换机问题:不是int的成员

    我在Swift中编写了我的第一个项目,由于某种原因,我无法找出为什么我的枚举和开关不工作属性开关我得到的错误是枚举大小写“viewmodeFavourite”不是“Int!”类型的成员所以我改为这个,因为它不是一个Int!forStoryboard)然后我得到枚举大小写模式不能匹配非枚举类型“Int”的值你必须将contactviewmode声明为Contactviewmode而不是Int。如果您真的希望它是Int,那么您必须通过将变量与枚举情况的rawValue属性进行比较来更改交换机中的大小写:但除非

  4. android – ContactsContract.CommonDataKinds.StructuredName的问题

    在查询联系人数据时,我得到了大部分工作.我正在与Structuredname和Organization战斗.他们不适合我.如果您不介意,请查看代码.它是手工制作的,并且删除了大量错误检查,以使其尽可能小地发布在此处.“不工作”的评论是对我不起作用的部分.两个前导if()是onActivityResult的一部分,我在联系人选择结束时收到数据.通过以下方式拨打电话:提前谢谢了HJW解决方法你的情况是错的.用于Structuredname:

  5. 如何在我的Android程序中访问联系人

    我正在制作短信应用程序并希望在我的Android应用程序中访问联系人.我想访问联系人,就像他们在实际联系人列表中的位置一样.选择后,我需要返回我的活动,我可以向该人发送短信.或者是否可以访问存储联系人的数据库?我的代码如下所示:我的LogCat看起来像这样:谁能帮我?解决方法使用此代码选择联系人:

  6. 如何避免在Android上的onCreate上重新创建视图?

    如何避免重新创建列表?

  7. 启动时Android应用程序崩溃:ContactsFragment中的SQLite NullPointerException

    我正在集成数据库来保存和存储以后要检索的基本联系信息.但是,我的应用程序现在在启动时崩溃,所以我甚至无法验证是否正在创建表等.数据库处理程序代码:logcat说问题是sqliteDatabasedb=this.getWriteableDatabase();这也是我违规的Contactsfragment:最后,这是ContactsDB类:非常感谢任何帮助–我认为问题在于我的Context为null.

  8. 在android中获取联系人非常慢

    我编写了一个代码来从联系人中获取联系人姓名,电话号码和图像,并将其显示在android的listview中.它工作正常,但需要更多时间来加载.我曾尝试在代码的某些部分使用多线程.但加载时间并未减少.这是onCreate()方法:以下是获取联系人的代码:这里,listview的setAdapter()函数在将所有联系人提取到ArrayList之后正在工作.有没有人知道如何在获取联系人期间显示联系人?

  9. 如何获取Android中联系人的所有详细信息

    给定联系人ID,我可以通过对每个字段进行不同的查询来获取各种联系人详细信息.但有没有一种方法可以通过单个查询获取与此联系人ID相关的所有详细信息?解决方法不得不改变ContentProviders上的一些教程,因为它引用了弃用的类,这可能会有所帮助.

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

    我尝试对用户联系人实施实时搜索,我想获取每个匹配联系人的姓名,缩略图和地址(如果有).用户键入时正在运行实时搜索.所以他输入了ma并将获得’martin’,’matthews’……

随机推荐

  1. bluetooth-lowenergy – Altbeacon库无法在Android 5.0上运行

    昨天我在Nexus4上获得了Android5.0的更新,并且altbeacon库停止了检测信标.似乎在监视和测距时,didEnterRegion和didRangeBeaconsInRegion都没有被调用.即使RadiusNetworks的Locate应用程序现在表现不同,一旦检测到信标的值,它们就不再得到更新,并且通常看起来好像信标超出了范围.我注意到的一点是,现在在logcat中出现以下行“B

  2. android – react-native动态更改响应者

    我正在使用react-native进行Android开发.我有一个视图,如果用户长按,我想显示一个可以拖动的动画视图.我可以使用PanResponder实现这一点,它工作正常.但我想要做的是当用户长按时,用户应该能够继续相同的触摸/按下并拖动新显示的Animated.View.如果您熟悉Google云端硬盘应用,则它具有类似的功能.当用户长按列表中的任何项目时,它会显示可拖动的项目.用户可以直接拖

  3. android – 是否有可能通过使用与最初使用的证书不同的证书对其进行签名来发布更新的应用程序

    是否可以通过使用与最初使用的证书不同的证书进行签名来发布Android应用程序的更新?我知道当我们尝试将这样的构建上传到市场时,它通常会给出错误消息.但有没有任何出路,比如将其标记为主要版本,指定市场中的某个地方?解决方法不,你不能这样做.证书是一种工具,可确保您是首次上传应用程序的人.所以总是备份密钥库!

  4. 如何检测Android中是否存在麦克风?

    ..所以我想在让用户访问语音输入功能之前检测麦克风是否存在.如何检测设备上是否有麦克风.谢谢.解决方法AndroidAPI参考:hasSystemFeature

  5. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

  6. android – 获得一首歌的流派

    我如何阅读与歌曲相关的流派?我可以读这首歌,但是如何抓住这首歌的流派,它存放在哪里?解决方法检查此代码:

  7. android – 使用textShadow折叠工具栏

    我有一个折叠工具栏的问题,在展开状态我想在文本下面有一个模糊的阴影,我使用这段代码:用:我可以更改textColor,它可以工作,但阴影不起作用.我为阴影尝试了很多不同的值.是否可以为折叠文本投射阴影?

  8. android – 重用arm共享库

    我已经建立了armarm共享库.我有兴趣重用一个函数.我想调用该函数并获得返回值.有可能做这样的事吗?我没有任何头文件.我试过这个Android.mk,我把libtest.so放在/jni和/libs/armeabi,/lib/armeabi中.此时我的cpp文件编译,但现在是什么?我从objdump知道它的名字编辑:我试图用这个android.mk从hello-jni示例中添加prebuild库:它工作,但libtest.so相同的代码显示以下错误(启动时)libtest.so存在于libhello-j

  9. android – 为NumberPicker捕获键盘’Done’

    我有一个AlertDialog只有一些文本,一个NumberPicker,一个OK和一个取消.(我知道,这个对话框还没有做它应该保留暂停和恢复状态的事情.)我想在软键盘或其他IME上执行“完成”操作来关闭对话框,就像按下了“OK”一样,因为只有一个小部件可以编辑.看起来处理IME“Done”的最佳方法通常是在TextView上使用setonEditorActionListener.但我没有任何Te

  10. android – 想要在调用WebChromeClient#onCreateWindow时知道目标URL

    当我点击一个带有target=“_blank”属性的超链接时,会调用WebChromeClient#onCreateWindow,但我找不到新的窗口将打开的新方法?主页url是我唯一能知道的东西?我想根据目标网址更改应用行为.任何帮助表示赞赏,谢谢!

返回
顶部