【问题标题】:Search contacts using name as well as company (like in default android 2.3.3 contacts app)使用姓名和公司搜索联系人(如默认的 android 2.3.3 联系人应用程序)
【发布时间】:2012-10-25 09:52:37
【问题描述】:

我开发了一个简单的联系人应用程序,还使用姓名实现了搜索。但现在我想同时使用姓名和公司进行搜索(就像默认的 android 联系人应用程序一样)。我可以使用公司单独搜索,但无法获取其他联系信息,因为返回的联系人 ID 不同...我已将代码粘贴在下面。

使用姓名搜索获取联系人的代码: (搜索字符串是使用textchangedlistener从edittext中获取的)

    private Cursor getContactsByName(String temp) {
        Uri uri = ContactsContract.Contacts.CONTENT_URI;
        String[] projection = new String[] { ContactsContract.Contacts._ID,
            ContactsContract.Contacts.DISPLAY_NAME, };
        String selection = ContactsContract.Contacts.DISPLAY_NAME + " like '"
            + temp + "%'";
        String[] selectionArgs = null;
        String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
            + " COLLATE LOCALIZED ASC";
        return managedQuery(uri, projection, selection, selectionArgs,
            sortOrder);
    }

使用公司搜索获取联系人的代码: (搜索字符串是使用textchangedlistener从edittext中获取的)

    private Cursor getContactsByCompany(String temp) {      
        Uri uri = ContactsContract.Data.CONTENT_URI;
        String[] proj = new String[] { ContactsContract.Contacts._ID,
            ContactsContract.Contacts.DISPLAY_NAME, Organization.COMPANY};      

        String selection3 = Data.MIMETYPE + "='" + Organization.CONTENT_ITEM_TYPE +
            "' AND " + Organization.COMPANY + " like '" + temp + "%'";
        String[] selectionArgs = null;
        String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
            + " COLLATE LOCALIZED ASC";
        return managedQuery(uri, proj, 
            selection3, selectionArgs, sortOrder);      
    }

在第一种情况下(即姓名搜索),我得到一个带有联系人 ID、姓名等信息的光标。使用联系人 ID,我会在查看联系人页面中显示联系人的信息,例如照片、电子邮件。

在第二种情况下(即公司搜索),我得到一个带有联系人 ID、姓名和公司信息的光标。但是这里为相同联系人返回的联系人 id 与第一种情况下返回的不同。因此,我无法使用此联系人 ID 获取联系人的其他信息,例如照片、电子邮件等。

如果一个联系人的联系人 ID 在案例 1 和案例 2 中都相同,我可以通过删除重复项将两个搜索合并为一个。但这里不是这样。

所以我的问题是,如果联系人 ID 不同,我如何从第二种情况中找到联系信息,以及如何将这两种搜索结合起来?

【问题讨论】:

    标签: android android-contacts contactscontract


    【解决方案1】:

    我终于找到了解决办法。

    问题在于返回的联系人 ID。

    所以在第一种情况下(即按名称搜索),我们必须将 ContactsContract.Contacts._ID 作为联系人。

    在第二种情况下(按公司搜索),因为 Uri 不同(在这种情况下是 ContactsContract.Data.CONTENT_URI),而且选择标准Data.MIMETYPE是Organization.CONTENT_ITEM_TYPE,我们要使用Organization.CONTACT_ID

    同样,当您使用电子邮件进行搜索时,您必须使用 ContactsContract.CommonDataKinds.Email.CONTACT_ID 作为联系人 ID。 其他领域也是如此。

    使用这些联系人 ID,我们可以按名称和公司组合搜索。我们可以使用 Set 概念删除联系人 ID 中的重复项。

    【讨论】:

      【解决方案2】:

      使用此功能进行组合搜索..它可以帮助你..

      private Cursor getContactsByCompanyORname(String temp) {      
          Uri uri = ContactsContract.Data.CONTENT_URI;
          String[] proj = new String[] { ContactsContract.Contacts._ID,
              ContactsContract.Contacts.DISPLAY_NAME, Organization.COMPANY};      
      
          String selection3 = Data.MIMETYPE + "='" + Organization.CONTENT_ITEM_TYPE +
              "' AND " + Organization.COMPANY + " like '" + temp + "%'" + "' OR '" ContactsContract.Contacts.DISPLAY_NAME + " like '" + temp + "%'";
          String[] selectionArgs = null;
          String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
              + " COLLATE LOCALIZED ASC";
          return managedQuery(uri, proj, 
              selection3, selectionArgs, sortOrder);      
      }
      

      所以改变字符串选择3

      【讨论】:

      • 我使用了您的代码,在 selection3 中进行了细微的语法更改,但它不起作用...
      【解决方案3】:

      这花了很长时间和很多挫折!以下按联系人姓名、公司和职务进行搜索:

      /**
       * Creates the Loader used to load contact data filtered by the
       * given Query String.
       */
      private Loader<Cursor> createLoaderFiltered(String theQueryString) 
      {      
      final String[] COLS = new String[] {"contact_id", ContactsContract.Contacts._ID, 
                                          ContactsContract.Contacts.DISPLAY_NAME};
      
      final String LIKE = " LIKE '%" + theQueryString + "%'";
      final Uri    URI = ContactsContract.Data.CONTENT_URI;
      final String ORANIZATION_MIME = Organization.CONTENT_ITEM_TYPE;
      final String NAME_MIME = StructuredName.CONTENT_ITEM_TYPE;
      final String WHERE = 
          "(" + 
          Data.MIMETYPE + "='" + ORANIZATION_MIME + "'" +
          " AND (" + Organization.COMPANY + LIKE + " OR " + Organization.TITLE + LIKE + ")" +
          " AND " + ContactsContract.Contacts.DISPLAY_NAME + " NOT " + LIKE +
          ") OR (" +
          Data.MIMETYPE + "='" + NAME_MIME + "'" +
          " AND " + ContactsContract.Contacts.DISPLAY_NAME + LIKE + ")";
      
      final String SORT = ContactsContract.Contacts.DISPLAY_NAME + 
                          " COLLATE LOCALIZED ASC";
      
      return new CursorLoader(getActivity(), URI, COLS, WHERE, null, SORT);      
      }
      

      需要“ContactsContract.Contacts.DISPLAY_NAME NOT LIKE”子句来消除联系人姓名和公司/职务都匹配的联系人的重复行。

      【讨论】:

        猜你喜欢
        • 2013-09-07
        • 1970-01-01
        • 2012-10-11
        • 1970-01-01
        • 1970-01-01
        • 2011-06-19
        • 1970-01-01
        • 2018-09-21
        • 1970-01-01
        相关资源
        最近更新 更多