在 android 上更新 SQLite 数据库的最快方法(如果记录尚不存在,则添加记录)
Quickest way to update SQLite database on android (or add record if it does not yet exist)
我编写了以下代码来使用 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_*** 是在代码其他地方定义的列名)
不过,我想知道这是否是最好的方法。该代码需要相当长的时间才能 运行.
我在某处读到,如果您想更新数据,可以分批进行。但是,当您只想在记录存在时更新以及当记录不存在时您想要添加时,您也可以这样做吗?
您可以像使用 INSERT INTO
命令一样使用 REPLACE INTO
命令,以便不必检查记录是否存在并执行相应的 UPDATE
或 INSERT INTO
命令。
SQLite 将首先删除该行(如果存在),然后再插入新行。
因此您可以编写一个 execSQL()
指令,它使用您当前正在执行查询的 REPLACE INTO
命令,然后决定下一个执行哪个命令。
REPLACE INTO
将帮助您跳过所有这些逻辑。
我发现它真的很有用。
我编写了以下代码来使用 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_*** 是在代码其他地方定义的列名)
不过,我想知道这是否是最好的方法。该代码需要相当长的时间才能 运行.
我在某处读到,如果您想更新数据,可以分批进行。但是,当您只想在记录存在时更新以及当记录不存在时您想要添加时,您也可以这样做吗?
您可以像使用 INSERT INTO
命令一样使用 REPLACE INTO
命令,以便不必检查记录是否存在并执行相应的 UPDATE
或 INSERT INTO
命令。
SQLite 将首先删除该行(如果存在),然后再插入新行。
因此您可以编写一个 execSQL()
指令,它使用您当前正在执行查询的 REPLACE INTO
命令,然后决定下一个执行哪个命令。
REPLACE INTO
将帮助您跳过所有这些逻辑。
我发现它真的很有用。