需要SQLite只用新信息替换行

时间:2013-06-26 14:31:46

标签: java android sqlite

我正在创建一个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;
}

更新:我得到一张完整的表格信息,但可能会更新任意数量的行

2 个答案:

答案 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,如果列表中的数据更新(但未出现在屏幕上),则数据集将会更新,但用户不会受到影响(直到他们滚动到新数据,将在那里。)

我认为您应该使用这种内置功能,而不是使用自定义方法(因为这应该更具可扩展性)。