【问题标题】:Duplicate entries when fetching contacts groups Android 4+获取联系人组时出现重复条目​​ Android 4+
【发布时间】:2013-04-29 15:35:00
【问题描述】:

我正在使用以下查询获取所有联系人组:

//get list of contact groups from ContactsContract
    Cursor groups_cursor = getContentResolver()//
            .query(ContactsContract.Groups.CONTENT_SUMMARY_URI,//
                    new String[] { //
                    ContactsContract.Groups._ID,//
                            ContactsContract.Groups.TITLE, //
                            ContactsContract.Groups.DATA_SET,//
                            ContactsContract.Groups.GROUP_VISIBLE,//
                            ContactsContract.Groups.DELETED,//
                            ContactsContract.Groups.SYSTEM_ID,//
                            ContactsContract.Groups.SUMMARY_COUNT, //
                            ContactsContract.Groups.SUMMARY_WITH_PHONES //
                    },//
                    null, null, null);//

我的光标总是包含两次“家庭”、“朋友”和“同事”组。

为什么我会得到这些重复项?

我同步了一个 Google 帐户。

联系人应用程序中正确列出了群组。

【问题讨论】:

    标签: android android-contacts


    【解决方案1】:

    我也遇到过类似的问题。在我的设备上,我注意到:

    • 对于每对重复组,一个组始终包含 0 个联系人 (ContactsContract.Groups.SUMMARY_COUNT),并且
    • 拥有 > 0 个联系人的所有联系人组都有一个非空的 ContactsContract.Groups.NOTES 列。

    我仍然不清楚为什么会返回空组,但我已经通过选择非空组或具有非空注释列的那些来解决它。

    希望这会有所帮助!

    【讨论】:

    • 谢谢,我试试看
    • 没问题。祝你好运!
    【解决方案2】:

    我发现所有这些空的重复组的 ACCOUNT_TYPE = "DeviceOnly",而合法组的 ACCOUNT_TYPE = "com.google"。因此,如果您将其添加为参数,您应该会很好!

    这是我的选择声明

        private static final String CONTACT_GROUP_SELECTION = ContactsContract.Groups.AUTO_ADD + " = 0 "
            + " AND " + ContactsContract.Groups.ACCOUNT_TYPE + " = 'com.google' "
            + " AND " + ContactsContract.Groups.ACCOUNT_NAME + " NOT NULL  "
            + " AND " + ContactsContract.Groups.FAVORITES + " = 0 "
            + " AND " + ContactsContract.Groups.DELETED + " = 0  ";
    

    添加其他子句是因为internal Android library 使用了它们,这似乎是个好主意。但是直到我添加了“com.google”子句,我的重复组问题才消失。

    【讨论】:

      【解决方案3】:

      这是一个老问题,但由于仍然没有正确答案,这是我的:

      • 可以删除组
      • 群组可以不可见(仅供内部使用)
      • 群组可以有不同的来源(电话联系人、不同的同步适配器 = Google 帐户或其他一般帐户)

      前两个可以很容易地使用:

      ContactsContract.Groups.DELETED + " = 0 AND " +
      ContactsContract.Groups.GROUP_VISIBLE + " = 1";
      

      来源可能根本不应该被过滤。我在我的设备上使用了多个 Google 帐户,最终有多个“已在 Android 中加注星标”和“我的联系人”组,这些组由 Google 同步适配器为不同的帐户同步。 最好的解决方案可能是合并具有相同名称的组。用户通常不关心联系人/群组是从哪个帐户同步的。

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题(在 LG G4 上的 Android 5.1 上)并且所有答案都是错误的。

        GROUP_VISIBLE = '1' 不会返回联系人应用程序中可见的所有组。

        NOTES 也没有提供任何可靠的信息,因为所有组都有一些注释。

        ACCOUNT_TYPE - 也是错误的,因为我添加了我的组,并且它出现了两次 - 一个是 com.google 类型,另一个是 lg.sync 但一些 com.google 组不是空的,还有一些lg.sync 组也不为空。

        看起来查询联系人组的唯一可靠方法是选择非空组。如果您的要求是也显示空组,那么除了显示两者之外,您无能为力。

        有趣的是,在 MotoG 第一代 Android 5.1 上,一切似乎都运行良好,没有重复的组。只有GROUP_VISIBLE 效果不好,因为它根本不显示自定义组。

        【讨论】:

        • GROUP_VISIBLE - 指示属于该组的联系人是否应在任何用户界面中可见的标志,请阅读 ContactsContract.java 。
        猜你喜欢
        • 1970-01-01
        • 2011-07-16
        • 2015-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-16
        相关资源
        最近更新 更多