0

我正在制作一个 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;
}

更新:我正在获取完整表的信息,但有可能更新了任意数量的行

4

2 回答 2

1

我建议您通过以下步骤解决该问题:

  • 创建一个比较除 ID 属性之外的所有属性isTechnicalEqual(Vehicle pVehicle)的便捷方法:Vehicle

            //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
        }
    
于 2013-06-26T14:52:58.680 回答
0

在我看来,您想使用名为“Loaders”(在 API 3.0 中引入)的框架中内置的功能。这将自动更新支持您的列表的数据集,并为 UI 提供更新(您可以在需要时采取行动)。

http://developer.android.com/guide/components/loaders.html

如果您在适配器中使用 ViewHolder,如果列表中的数据更新(但未出现在屏幕上),则数据集将更新,但不会影响用户(直到他们滚动到新数据,这将在那里)。

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

于 2013-06-26T14:59:40.443 回答