Как искать контакты не имеющие группы

У меня вопрос по поводу контактов андроида. Я хочу запросить все контакты, не назначенные ни в какую группу, но я не уверен в условии поиска, я имею в виду, что иногда GroupMembership.GROUP_ROW_ID имеет значение null Если у контактов нет группы, но иногда GroupMembership.GROUP_ROW_ID равен -1 . Может кто подскажет, как искать все контакты без группы?


person user1145055    schedule 29.01.2012    source источник


Ответы (1)


Это немного грубо, но это работает для меня. Я не мог найти простой способ найти контакты ни в одной группе, не выполняя два запроса.

Вполне вероятно, что вы можете оптимизировать запрос для удаления дубликатов, тем самым устраняя необходимость в наборе foundIds.

    private Cursor getNoGroupsCursor() {

    Set<String> groupIds = new HashSet<String>();
    Set<String> foundIds = new HashSet<String>();

    // Get the group membership
    Cursor gmCursor = getContentResolver().query(
            Data.CONTENT_URI,
            new String[] { Data.CONTACT_ID, Data.MIMETYPE, Data.DATA1 },
            Data.MIMETYPE + " = '" + GroupMembership.CONTENT_ITEM_TYPE
            + "'", null, null);

    while (gmCursor.moveToNext()) {
        String groupTitle = gmCursor.getString(2);
        // We need to pre-parse the group ids to find all the ones that
        // have a group
        if (groupTitle != null && !"-1".equals(groupTitle)) {
            groupIds.add(gmCursor.getString(0));
        }
    }

    gmCursor.close();

    // Get the contacts
    gmCursor = getContentResolver().query(Data.CONTENT_URI,
            new String[] { Data.CONTACT_ID, Data.DISPLAY_NAME }, null,
            null, "2 ASC");

    // We want a projected matrix cursor that contains the contact ID and
    // group name, rather than the group ID
    MatrixCursor mc = new MatrixCursor(PROJECTION_GROUPS);

    while (gmCursor.moveToNext()) {

        String id = gmCursor.getString(0);

        if (!foundIds.contains(id) && !groupIds.contains(id)) {
            mc.addRow(new Object[] { gmCursor.getString(0),
                    gmCursor.getString(1), null, null });
            foundIds.add(id);
        }
    }

    gmCursor.close();

    return mc;
}
person SoftWyer    schedule 29.01.2012
comment
И да, я знаю, что идентификаторы - это длинные, а не строки. Мех. - person SoftWyer; 29.01.2012
comment
Спасибо за ваш ответ, теперь я могу использовать поиск только в два шага, чтобы решить эту проблему, возможно, мы сможем найти лучший способ, например, выполнить поиск в представлении view_data. - person user1145055; 03.02.2012