在Android上更新SQLite数据库的最快方法(如果它还不存在则添加记录)

时间:2016-10-01 08:53:19

标签: android sqlite optimization android-sqlite

我编写了以下代码,使用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 _ ***是在代码中其他地方定义的列名)

我想知道这是否是最好的方法。代码需要相当长的时间才能运行。

我已经读过某个地方,如果你想更新数据,你可以批量执行此操作。但是,如果您只想在记录存在时更新并且如果要在不退出时添加记录,那么您是否也可以这样做?

1 个答案:

答案 0 :(得分:1)

您可以像使用REPLACE INTO一样使用INSERT INTO命令,以便不必检查记录是否存在并执行相应的UPDATE或{{1}命令 SQLite将首先删除该行(如果存在),然后重新插入。

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

REPLACE INTO将帮助您跳过所有逻辑 我发现它非常有用。