Рекурсивный запрос с упорядоченными значениями в SQLite Android - PullRequest
2 голосов
/ 01 марта 2012

У меня есть одна group таблица с рекурсивным отношением, поэтому у каждой записи есть parent_id. Для данной группы мне нужно получить все student (каждый из которых принадлежит группе) имен во всех ее подгруппах, но упорядочено по имени студента.

Знаете ли вы, есть ли какой-нибудь "легкий" способ сделать это? Если мне нужно выполнить несколько запросов, я должен упорядочить результаты разных курсоров, но у курсора нет функции orderBy ().

Есть идеи? Большое вам спасибо!

1 Ответ

2 голосов
/ 07 марта 2012

Поскольку SQLite не поддерживает рекурсивные запросы, я реализовал select с помощью двух шагов:

Во-первых, у меня есть метод с именем getRecursiveDiningGroupIdsAsString(), который рекурсивно получает все идентификаторы групп, родительский идентификатор которых тот, который вы проходите мимопараметр.В результате получается строка в форме: «(2, 3, 4)», так что вы можете позже использовать ее в предложении IN.Метод выглядит следующим образом:

public String getRecursiveDiningGroupIdsAsString(int depth, long diningGroupId) {
    Cursor childDiningGroups = mDatabase.query(
            "group",
            new String[] {"_id"},
            "parent_id = "+diningGroupId,
            null, null, null, null
    );
    String recursiveDiningGroupIds = "";
    while (childDiningGroups.moveToNext()) {
        long childDiningGroupId = childDiningGroups.getLong(childDiningGroups.getColumnIndex("_id"));
        recursiveDiningGroupIds += getRecursiveDiningGroupIdsAsString(depth+1, childDiningGroupId);
    }
    recursiveDiningGroupIds += diningGroupId;
    if (depth > 0) {
        recursiveDiningGroupIds += ", ";
    } else {
        recursiveDiningGroupIds = "("+recursiveDiningGroupIds+")";
    }
    return recursiveDiningGroupIds;
}

Как только у меня есть нужные групповые идентификаторы, я просто делаю простой запрос, используя идентификаторы, возвращенные предыдущим методом, и все!

Надеюсьпомогает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...