Что делать с курсором после запроса SQLite? - PullRequest
3 голосов
/ 22 июля 2011

Я впервые использую базу данных, и я не совсем уверен, как это работает. Я сделал базу данных и сделал запрос, который возвращает курсор и ... что теперь? Что такое курсор, на самом деле? Могу ли я просто использовать это для навигации по моим данным или мне нужно поместить их в ArrayList или ListActivity или как?

Ответы [ 6 ]

6 голосов
/ 22 июля 2011

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

Используйте cursor.moveToFirst() и / или cursor.moveToNext() (с циклом while). Затем вы можете использовать метод getX (), например cursor.getInt() или cursor.getString().

Например, если вы ожидаете один результат от вашего запроса:

if (cursor.moveToFirst()) {
    String name = cursor.getString(cursor.getColumnIndex('NAME'));
    int age = cursor.getInt(cursor.getColumnIndex('AGE'));
} else {
    // oops nothing found!
}
2 голосов
/ 22 июля 2011

Первый вызов cursor.moveToFirst ().Каждый раз, когда вы вызываете cursor.moveToNext (), он будет перемещаться в следующую строку.Когда вы закончите с курсором, убедитесь, что вы вызываете cursor.deactivate (), иначе вы получите ошибки в вашем журнале cat.

1 голос
/ 22 июля 2011

Переберите возвращенный экземпляр Cursor

public List<Object[]> cursorToTableRows(Cursor cursor) {
        List<Object[]> result = new ArrayList<Object[]>(cursor.getCount());

        cursor.move(0);
        cursor.moveToNext();
        while (cursor.isAfterLast() == false) {
            Object[] tableRow = new Object[cursor.getColumnCount()];
            for(int i=0; i<cursor.getColumnNames().length; i++) {
                int columnIndex = cursor.getColumnIndex(cursor.getColumnName(i));
                String columnValue = cursor.getString(columnIndex);
                tableRow[i] = columnValue;
            }
            result.add(tableRow);
            cursor.moveToNext();
        }

        cursor.close();

        return result;
    }

Затем создайте нужные объекты.

public List<Vehicle> getVehicles() {
        List<Vehicle> vehicles = new ArrayList<Vehicle>();
        Cursor cursor = null;
        List<Object[]> objects = cursorToTableRows(cursor);
        for(Object[] row : objects) {
            int i=0;
            Vehicle vehicle = new Vehicle(row[i++].toString(), row[i++].toString()));
            vehicles.add(vehicle)
        }
        return vehicles;
    }
0 голосов
/ 12 декабря 2013

После того, как вы успешно настроите Cursor , вы, как правило, захотите отобразить его в виде в некоторой форме.

Посмотрите на следующий ответ для подробного, но простого примера использования Cursor Adapter для сопряжения вашего только что созданного Cursor с желаемым представлением XML:

https://stackoverflow.com/a/20532937/293280

0 голосов
/ 22 июля 2011

из Developer.android : этот интерфейс обеспечивает произвольный доступ на чтение и запись к набору результатов, возвращенному запросом к базе данных.

Другими словами: запрос возвращает вам набор представленных данныхкурсором.Сначала вам нужно убедиться, что у вас есть правильный курсор (не нулевой), а затем попытаться переместить его в нужную позицию в наборе данных (используйте методы moveToXXX).Чтобы получить данные, на которые указывает курсор, используйте методы getXXX.Когда закончите с использованием этого, убедитесь, что вы вызвали близко к ресурсам релиза.

0 голосов
/ 22 июля 2011

Согласно этой ссылке похоже, что вы можете перебрать возвращаемый запрос, используя что-то вроде:

cursor.next();

И захватите данные в нужном вам месте:

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