Android: запрос SQLite возвращает 0 строк без перезагрузки? - PullRequest
0 голосов
/ 23 февраля 2012

Мое приложение имеет базу данных SQLite, которая содержит список магистралей. Он показывает их все в списке. Сначала он пытается запросить базу данных для дорог. Если запрос не возвращает ничего, он вызывает другой метод, который загружает список с удаленного сервера и заполняет базу данных. После этого он сразу же снова запрашивает базу данных.

Вот как это должно работать. Как это работает на самом деле, первый запрос всегда ничего не возвращает. Он идет прямо к загрузке нового списка, он вставляет список в базу данных и снова запрашивает. Второй запрос всегда возвращает правильный результат. Странно то, что я могу повторить операцию, даже не выходя из приложения. Используя оболочку adb, я могу читать базу данных SQLite3 на эмуляторе. Данные, отображаемые в базе данных, соответствуют ожиданиям. Но приложение ведет себя так, как будто данных там нет? Есть ли какое-то поведение, о котором я не знаю? Вот код.

RoadsDataSource.java

public class RoadsDataSource {

    private DataStorage data;

    private static Context context;

    public RoadsDataSource() {
        this.data = new DataStorage(RoadsDataSource.context);
    }

    private List<Road> getRoads(Integer state) {
        List<Road> roads = loadRoadsFromDb(state);
        if (roads.isEmpty()) {
            Request api = new Request(RoadsDataSource.context);
            Roads apiRoads = api.fetchRoads(state);
            this.data.storeRoads(apiRoads);
            roads = loadRoadsFromDb(state);
        }
        return roads;
    }

    private List<Road> loadRoadsFromDb(Integer state) {
        SQLiteQueryBuilder query = new SQLiteQueryBuilder();
        query.setTables(Queries.ROAD_STATE_MATCHES);
        Cursor results = query.query(
                this.data.getWritableDatabase(),
                new String[] {Tables.ROADS + "." + Tables.Roads.ID, Tables.ROADS + "." + Tables.Roads.TYPE, Tables.ROADS + "." + Tables.Roads.NUMBER}, 
                Queries.ROADS_BY_STATE,
                new String[] {state.toString()}, null, null, null 
        );

        List<Road> roads = new ArrayList<Road>();

        results.moveToFirst();
        while (!results.isAfterLast()) {
            roads.add(new Road(results.getInt(0), results.getString(1), results.getInt(2)));
            results.moveToNext();
        }
        results.close();

        System.out.println(roads.size());
        return roads;
    }
}

DataStorage.java

public class DataStorage extends SQLiteOpenHelper {
    public void storeRoads(Roads roads) {
        SQLiteDatabase db = this.getWritableDatabase();
        for (Road road : roads.getRoads()) {
            ContentValues roadRow = new ContentValues();
            roadRow.put(Tables.Roads.ID, road.getId());
            roadRow.put(Tables.Roads.TYPE, road.getType());
            roadRow.put(Tables.Roads.NUMBER, road.getNumber());
            try {
                db.insertOrThrow(Tables.ROADS, null, roadRow);
            } catch (SQLException e) {
            }
            ContentValues linkRow = new ContentValues();
            linkRow.put(Tables.StatesRoads.STATE_ID, roads.getState());
            linkRow.put(Tables.StatesRoads.ROAD_ID, road.getId());
            try {
                db.insertOrThrow(Tables.STATES_ROADS, null, linkRow);
            } catch (SQLException e) {
            }
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 25 февраля 2012

Мо Каргас прав.Ваш помощник по БД должен выглядеть примерно так http://code.google.com/p/android-notes/source/browse/trunk/src/com/bitsetters/android/notes/DBHelper.java?r=10

Это может решить вашу проблему, хотя замените

SQLiteDatabase db = this.getWritableDatabase();

на

SQLiteDatabase db;
try {
    db = dbHelper.getWritableDatabase();
} catch (SQLiteException e) {
   db = dbHelper.getReadableDatabase();
}
1 голос
/ 26 февраля 2012

В прошлом у меня были огромные проблемы, когда я не закрывал дескриптор базы данных - обычно я выполняю все операции с БД внутри подкласса SQLiteOpenHelper, сохраняя ссылку на БД, открывая и закрывая ее атомарно.

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