我正在创建一个SQLite数据库,该数据库将存储来自网络服务器(对于Android应用程序)的信息,该数据库的数据可能随时发生变化。删除表并重新制作表似乎效率低下。
有没有办法检测变化?例如,VehicleID不会改变,那么如何检查行是否发生了变化?
我目前的实施,我不喜欢
public int updateAllVehicle(ArrayList<Vehicle> vehicleList) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
// vehicleList populated? Basically to see that I am not going to lose my list of vehicles
if (vehicleList.size() * .75 > getVehicleCount()) {
//delete table
db.delete(TABLE_VEHICLE, null, null);
//remake table
for (Vehicle vehicle : vehicleList) {
values.put(KEY_VEHICLE_ID, vehicle.getvehicleID());
values.put(KEY_TRACK_ID, vehicle.gettrackID());
values.put(KEY_VEHICLE_NAME, vehicle.getvehicleName());
...(20 more attributes here that I omitted for StackOverflow)
}
return vehicleList.size();
}
return 0;
}
更新:我得到一张完整的表格信息,但可能会更新任意数量的行
答案 0 :(得分:1)
我建议您通过以下步骤解决问题:
在isTechnicalEqual(Vehicle pVehicle)
中创建一个便捷方法Vehicle
,用于比较ID属性以外的所有属性:
//Dont forgett Nullcheck!
if (!this.gettrackID().equals(pVehicle.gettrackID()))
return false;
//etc... after all attribute are checked:
return true;
如果一个属性不等于return false
。在函数return true
。
现在从本地数据库中选择所有现有的车辆并将其存储在Map<Integer,Vehicle>
lLocalDb //整数是您的车辆ID
List<Vehicle>
必须插入,另一个列表用于更新。迭代所有通过的车辆并致电:
Vehicle lVehicleDB = lLocalDb.get(lVehicle.getId());
if (null == lVehicleDB){
lInsertList.add(lVehicleDB);
}else{
if (!lVehicleDB.isTechnicalEqual(lVehicle))
lUpdateList.add(lVehicle);
}
循环结束后,请执行以下操作:
if (!lInsertList.isEmpty){
//Call SQLite insert for the list lInsertList
}
if (!lUpdateList.isEmpty){
// Call SQLite update for the list lUpdateList
}
答案 1 :(得分:0)
听起来我想要使用内置于名为“Loaders”(在API 3.0中引入)的框架中的功能。这将自动更新支持列表的数据集,并提供UI的更新(您可以根据需要对其进行操作)。
http://developer.android.com/guide/components/loaders.html
如果您在适配器中使用ViewHolder,如果列表中的数据更新(但未出现在屏幕上),则数据集将会更新,但用户不会受到影响(直到他们滚动到新数据,将在那里。)
我认为您应该使用这种内置功能,而不是使用自定义方法(因为这应该更具可扩展性)。