0

いつでも変更される可能性のあるデータを持つ Web サーバー (Android アプリ用) からの情報を格納する SQLite データベースを作成しています。テーブルを削除してテーブルを再作成するのは効率が悪いようです。

変化を検出する方法はありますか?たとえば、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;
    

    1 つの属性が等しくない場合return false。関数の最後にreturn true.

  • ローカル データベースから既存のすべての車両を選択し、Map<Integer,Vehicle>lLocalDb に保存します //整数は車両 ID です

  • 2 つのリストを作成します:List<Vehicle>挿入する必要がある車両用と、更新用の別のリストです。
  • 渡されたすべての 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 に答える