我的应用程序有一个SQLite数据库来包含高速公路列表。它将它们全部显示在列表中。它首先尝试查询道路的数据库。如果查询没有返回任何内容,它会调用另一种方法从远程服务器下载列表并填充数据库。之后返回,它立即再次查询数据库。Android:SQLite查询返回0行没有重新加载?
这就是它应该如何工作。它的实际工作原理是,第一个查询总是什么都不返回。它直接下载新的列表,它将列表插入数据库,然后再次查询。第二个查询总是返回正确的结果。奇怪的是,我可以在没有退出应用程序的情况下重复操作。使用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) {
}
}
}
}
我不熟悉android的包装。就一般的sqlite而言,如果事务没有完成,我会期待这种行为。我也不会允许那些空的渔获物通过代码审查。你在问奇怪的行为。 :) – 2012-02-25 03:23:24
关于空捕获量,我处于开发的早期阶段。在这一点上,我只是试图获得功能,然后我会回去处理例外情况。 – Jonah 2012-02-25 05:04:19
只是几个问题 - 但在loadRoads中,您不应该使用getReadableDatabase()并关闭由getWriteableDatabase调用打开的句柄吗? – 2012-02-25 05:48:34