我编写了以下代码,使用SQLite更新数据库中的一些信息。想法是在条目已经存在的情况下更新值(userAverageTime),或者如果条目尚不存在则创建新记录。
以下是代码:
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 :(得分:1)
您可以像使用REPLACE INTO
一样使用INSERT INTO
命令,以便不必检查记录是否存在并执行相应的UPDATE
或{{1}命令
SQLite将首先删除该行(如果存在),然后重新插入。
因此,您可以编写INSERT INTO
指令,该指令使用当前正在执行查询的execSQL()
命令,然后决定下一个要执行的命令。
REPLACE INTO
将帮助您跳过所有逻辑
我发现它非常有用。