我编写了一个调度程序应用程序,当用户使用以下内容从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});
数据被删除很好,但现在并非所有内容(只有一行)都添加回数据库中。所以我的想法是:
执行第二次插入查询时,删除查询仍在运行
所以,我的问题是。如何才能等到删除完成后才能正确添加新数据?
答案 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);