Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过PHONE.CONTENT\u URI检索联系人时返回重复的行_Java_Android_Android Sqlite - Fatal编程技术网

Java 通过PHONE.CONTENT\u URI检索联系人时返回重复的行

Java 通过PHONE.CONTENT\u URI检索联系人时返回重复的行,java,android,android-sqlite,Java,Android,Android Sqlite,我正在尝试按帐户类型从原始联系人中检索电话号码。 使用下面的代码片段 String SELECTION = ContactsContract.RawContacts.ACCOUNT_TYPE + "='" + Constants.ACCOUNT_TYPE + "'"; ContentResolver cr = this.getContentResolver(); Cursor cur = cr.query(ContactsContract.RawCont

我正在尝试按帐户类型从原始联系人中检索电话号码。 使用下面的代码片段

String SELECTION =
            ContactsContract.RawContacts.ACCOUNT_TYPE + "='" + Constants.ACCOUNT_TYPE + "'";

    ContentResolver cr = this.getContentResolver();
    Cursor cur = cr.query(ContactsContract.RawContacts.CONTENT_URI,
            null, SELECTION, null, ContactsContract.Contacts.DISPLAY_NAME + " ASC");
    if (cur.getCount() > 0) {
        while (cur.moveToNext()) {
            String type = cur.getString(cur.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_TYPE));
            String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            //String phone = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            Log.e("number",name);
           // hasPhoneNumber(cur.getString(cur.getColumnIndex(ContactsContract.RawContacts._ID)));
        }
        cur.close();
    }
我可以检索与帐户类型关联的所有联系人,但hasPhoneNumber(字符串contactId)返回一个空光标

private boolean hasPhoneNumber(String id) {
    Cursor pCur = this.getContentResolver().query(
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            null,
            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
            new String[]{id}, null);
    while (pCur.moveToNext()) {
        String phoneNo = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        phoneNo = phoneNo.replace(" ", "");
        if (Integer.parseInt(pCur.getString(
                pCur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
            Log.e("search", "found phone number");
            pCur.close();
            return true;
        }
        pCur.close();
    }
    return false;
}
但是,我决定使用PHONE.CONTENT\u URL执行查询,如下所示:

String SELECTION =
            ContactsContract.RawContacts.ACCOUNT_TYPE + "='" + Constants.ACCOUNT_TYPE + "'";

    ContentResolver cr = this.getContentResolver();
    Cursor cur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            null, SELECTION, null, ContactsContract.Contacts.DISPLAY_NAME + " ASC");
    if (cur.getCount() > 0) {
        while (cur.moveToNext()) {
            String type = cur.getString(cur.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_TYPE));
            String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            String phone = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            Log.e("number",phone);
           // hasPhoneNumber(cur.getString(cur.getColumnIndex(ContactsContract.RawContacts._ID)));
        }
        cur.close();
    }
这和预期的一样,只是我只有3个联系人与我的联系人列表上的查询相匹配,但是while循环运行了6次,每个数字显示两次。我如何才能最好地实现这一点?我做错了什么?

您可以尝试在URI上使用参数:

Uri uri = Phone.CONTENT_URI.buildUpon()
        .appendQueryParameter(ContactsContract.REMOVE_DUPLICATE_ENTRIES, "1")
        .build();
但是,如果您有两个相同号码的原始联系人,我不认为您可以消除重复的联系人,因为上面的查询参数仅使Android将
GROUP BY(RawContacts.\u ID,DATA1)
应用于查询。

您可以尝试在URI上使用参数:

Uri uri = Phone.CONTENT_URI.buildUpon()
        .appendQueryParameter(ContactsContract.REMOVE_DUPLICATE_ENTRIES, "1")
        .build();

但是,如果您有两个相同号码的原始联系人,我不认为您可以消除重复的联系人,因为上面的查询参数仅使Android将
GROUP BY(RawContacts.\u ID,DATA1)
应用于查询。

以下是我在查询
contacts contract.commondatatypes.Phone.CONTENT\u URI
时删除重复联系人的方法。我有一个
ArrayList
保存所有联系人。请注意我使用布尔
addNewContact
所做的操作。我检查是否有另一个联系人具有相同的
联系人ID
,如果没有,则会添加另一个联系人,如果有,则会跳过添加该联系人。请参见此处的完整片段:

Cursor cur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            null, null, null, null);

    cur.moveToPosition(-1);
    boolean addNewContact;
    if (cur.getCount() > 0) {
        while (cur.moveToNext()) {
            String thumb = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.PHOTO_THUMBNAIL_URI));
            String id = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
            String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

            if (allContacts==null)
                allContacts = new Vector<Contact>();


            addNewContact = true;
            for (Contact addedC:allContacts){
                if (addedC.id.equals(id))
                    addNewContact = false;
            }

            if (addNewContact) {
                Contact c = new Contact(name, id);

                if (thumb != null)
                    c.setThumb(cr, thumb);
                allContacts.add(c);
            }
        } 
    }

下面是我在查询
contacts contract.commondatatypes.Phone.CONTENT\u URI
时删除重复项的方法。我有一个
ArrayList
保存所有联系人。请注意我使用布尔
addNewContact
所做的操作。我检查是否有另一个联系人具有相同的
联系人ID
,如果没有,则会添加另一个联系人,如果有,则会跳过添加该联系人。请参见此处的完整片段:

Cursor cur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            null, null, null, null);

    cur.moveToPosition(-1);
    boolean addNewContact;
    if (cur.getCount() > 0) {
        while (cur.moveToNext()) {
            String thumb = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.PHOTO_THUMBNAIL_URI));
            String id = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
            String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

            if (allContacts==null)
                allContacts = new Vector<Contact>();


            addNewContact = true;
            for (Contact addedC:allContacts){
                if (addedC.id.equals(id))
                    addNewContact = false;
            }

            if (addNewContact) {
                Contact c = new Contact(name, id);

                if (thumb != null)
                    c.setThumb(cr, thumb);
                allContacts.add(c);
            }
        } 
    }

这可能是一个bug,但与查询数据的方式无关。这更像是一个与谷歌相关的问题。如果您尝试打开stock Lollipop Messenger应用程序,您也会在“new message”部分看到重复的行。我也在试图解决这个问题,顺便说一句,这可能是一个bug,但它与如何查询数据无关。这更像是一个与谷歌相关的问题。如果您尝试打开stock Lollipop Messenger应用程序,您也会在“new message”部分看到重复的行。我还试图通过在API级别21中添加ContactsContract.REMOVE\u DUPLICATE\u条目的方式来解决这个问题。ContactsContract.REMOVE\u DUPLICATE\u条目在API级别21中添加。