在 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 命令,以便不必检查记录是否存在并执行相应的 UPDATEINSERT INTO命令。
SQLite 将首先删除该行(如果存在),然后再插入新行。

因此您可以编写一个 execSQL() 指令,它使用您当前正在执行查询的 REPLACE INTO 命令,然后决定下一个执行哪个命令。

REPLACE INTO 将帮助您跳过所有这些逻辑。
我发现它真的很有用。