Android:SQLite查询返回0行没有重载?

时间:2012-02-23 02:31:24

标签: java android sqlite

我的应用程序有一个SQLite数据库,用于包含高速公路列表。它将它们全部显示在列表中。它首先尝试查询数据库中的道路。如果查询未返回任何内容,则会调用另一个从远程服务器下载列表的方法,并填充数据库。返回后,它会立即再次查询数据库。

它应该如何运作。它实际上是如何工作的,第一个查询总是什么都不返回。它直接下载一个新的列表,它将列表插入数据库,然后再次查询。第二个查询始终返回正确的结果。奇怪的是,我甚至可以在不退出应用程序的情况下重复操作。使用adb shell,我可以在模拟器上读取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 个答案:

答案 0 :(得分:2)

莫卡加斯是对的。您的db帮助程序看起来应该更像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 :(得分:1)

我在过去没有关闭数据库句柄时遇到了很多问题 - 通常我在SQLiteOpenHelper子类中执行所有数据库操作,保持对db的引用,以原子方式打开和关闭它。