【问题标题】:Getting Null Contact id when querying with account name in Raw Contacts in Android在 Android 的原始联系人中使用帐户名称查询时获取空联系人 ID
【发布时间】:2017-08-09 08:02:19
【问题描述】:
   private void displayAllContactsByType(String accountName) {
        Cursor rawCursor = null;

        try {
            rawCursor = mCProviderClient.query(
                    ContactsContract.RawContacts.CONTENT_URI,
                    null,
                    ContactsContract.RawContacts.ACCOUNT_NAME + "= ?",
                    new String[]{accountName},
                null);
        } catch (RemoteException e) {
            e.printStackTrace();
        }

        int contactIdColumn = rawCursor.getColumnIndex(ContactsContract.RawContacts.CONTACT_ID);


        Utils.Log("Raw Size", " " + rawCursor.getCount());

        while (rawCursor.moveToNext()) {


            String contactId = rawCursor.getString(contactIdColumn);

           // Utils.Log("contactId ",contactId);
            storeContactDetails(contactId);
        }

        if (contactList != null) {


            contactListener = (ContactListener) context;
            contactListener.updateView(contactList);

        }

    }

我正在获取原始联系人包含的所有帐户名称。我想让所有联系人都属于特定的帐户名,但我得到的联系人 ID 为空。如何获取特定帐户名称的所有联系人 ID,然后获取该联系人 ID 的相应数据?

【问题讨论】:

  • 你的contactList在哪里初始化?
  • 它已正确初始化。我的意思是全局,我在这里得到 null String contactId = rawCursor.getString(contactIdColumn);
  • 我很少使用游标,所以我可能错了,但这不是因为你在没有检查下一个东西的情况下移动下一步吗?尝试while (rawCursor.isAfterLast() == false) 而不是while (rawCursor.moveToNext()) 建议here
  • @Eselfar 不,moveToNext 将返回 true,如果它能够移动到下一个项目,while 循环就可以了

标签: android android-contacts


【解决方案1】:

首先,RawContacts.CONTACT_ID 的类型是 Long,而不是 String,所以你应该这样做:

Long contactId = rawCursor.getLong(contactIdColumn);

见:https://developer.android.com/reference/android/provider/ContactsContract.RawContactsColumns.html#CONTACT_ID 不要关注CONTACT_ID字段的类型,它总是字符串,看下面的Type: INTEGER

其次,这种情况很少见,但是当RawContact 不属于任何Contact 时会发生这种情况,我称之为僵尸RawContacts,它们可以通过损坏的数据库或错误创建,或者故意使用AGGREGATION_MODE 创建RawContact 时,请参阅AGGREGATION_MODE_DISABLED

【讨论】:

  • 我同意你的第二点,但如何避免僵尸 RawContacts。
  • 你无法避免它们,根据我的经验,僵尸存在于大约 20% 的设备上,主要是因为 SyncAdapters 中的错误(不在你的控制范围内)。您可以简单地跳过代码中没有有效CONTACT_ID 的 RawContacts,因为无论如何用户都看不到它们
  • 另一件事 count=rawCursor.getCount() 给出了正确的计数,比如我选择 Sim 1 作为帐户名称,我得到的计数为 7,但我的列表中只有 6 个联系人类似与其他帐户发生的情况相比,与上面代码中的计数相比,我获得的联系人数量更少。请建议
猜你喜欢
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
相关资源
最近更新 更多