2016-10-01 3 views
-1

SQLiteを使用してデータベース内の情報を更新するために、次のコードを書いています。そのアイデアは、エントリがすでに存在する場合には値(userAverageTime)を更新するか、エントリがまだ存在しない場合は新しいレコードを作成することです。androidでSQLiteデータベースを更新する最速の方法(またはレコードがまだ存在しない場合は追加する)

public void updateTableLevelsAverageTime(DatabaseOperations dop, LinkedList<Level> levels) { 
    SQLiteDatabase SQ = dop.getWritableDatabase(); 
    String selection = KEY_NUMBERS + " = ?"; 
    for (Level level: levels) { 
     String[] args = {level.toString()}; 
     ContentValues cv = new ContentValues(); 
     cv.put(KEY_AVERAGE_TIME, level.getAverageTime()); 
     int result = SQ.update(TABLE_LEVELS, cv, selection, args); 
     if (result == 0) { 
      //If the entry doesn't exist, it must be a new level... thus add it with 0 as userseconds 
      ContentValues cv2 = new ContentValues(); 
      cv2.put(KEY_NUMBERS, level.toString()); 
      cv2.put(KEY_AVERAGE_TIME, level.getAverageTime()); 
      cv2.put(KEY_USER_TIME, 0); 
      SQ.insert(TABLE_LEVELS, null, cv2); 
      Log.d("Database operations", "Row added"); 
     } 
     else { 
      Log.d("Database operations", "Row updated"); 
     } 
    } 
    SQ.close(); 
} 

(KEY _ ***コードの別の場所で定義されている列の名前です)

これが最善のアプローチだった場合、私はしかし、思っていた。ここで

はコードです。コードを実行するにはかなりの時間がかかります。

データを更新したい場合は、このバッチ方式で行うことができます。しかし、レコードが存在する場合にのみ更新したい場合や、レコードが存在しない場合にレコードを追加したい場合は、これを実行できますか?

答えて

0

あなたはレコードが存在するかどうかを確認する必要があり、対応するUPDATEまたはINSERT INTOコマンドを実行しないようにするために、INSERT INTO 1を使用するのと同じように、REPLACE INTOコマンドを使用することができます。
SQLiteはまず行を削除して(存在する場合)、それを新規に挿入します。

したがって、REPLACE INTOコマンドを使用して現在クエリを実行しているときに、次に実行するコマンドを決定するexecSQL()命令を記述することができます。

REPLACE INTOは、すべてのロジックをスキップするのに役立ちます。
本当に便利です。

関連する問題