多个execSQL()在一个函数中

时间:2016-02-25 20:09:33

标签: java android sqlite

我编写了一个调度程序应用程序,当用户使用以下内容从Internet更新计划时,该应用程序将计划数据添加到数据库:

sqLiteDatabase.execSQL("INSERT OR IGNORE INTO `subject` (`id`, `date`, `start`, `end`, `name`, `room`, `teacher`, `class_id`) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", new String[]{id, date, start, end, name, room, teacher, classId});

这很好用。

然而,可能存在一种情况,即在线时间表将改变其内容。因此我会写这样的函数:

sqLiteDatabase.execSQL("DELETE FROM `subject` WHERE `date` = ? AND `class_id` = ?", new String[] {date, classId});
sqLiteDatabase.execSQL("INSERT OR IGNORE INTO `subject` (`id`, `date`, `start`, `end`, `name`, `room`, `teacher`, `class_id`) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", new String[]{id, date, start, end, name, room, teacher, classId});

数据被删除很好,但现在并非所有内容(只有一行)都添加回数据库中。所以我的想法是:

执行第二次插入查询时,删除查询仍在运行

所以,我的问题是。如何才能等到删除完成后才能正确添加新数据?

1 个答案:

答案 0 :(得分:1)

这不是execSQL调用的方式;它们总是被正确地序列化。

要更新或插入记录,请先尝试更新,然后仅在找不到该记录时插入:

ContentValues cv = new ContentValues();
cv.put(...);
if (sqLiteDatabase.update("subject", cv, "Date = ? AND ClassID = ?",
                          new String[]{ date, classId }) < 1)
    sqLiteDatabase.insertOrThrow("subject", null, cv);
相关问题