Вярвам, че питате как да ВМЕСЕТЕ нови редове или АКТУАЛИЗИРАТЕ съществуващите си редове в една стъпка. Въпреки че това е възможно в един суров SQL, както е обсъдено в този отговор, открих, че е по-лесно да направите това в две стъпки в Android, като използвате SQLiteDatabase.insertWithOnConflict() с помощта на CONFLICT_IGNORE за конфликтАлгоритъм.
ContentValues initialValues = new ContentValues();
initialValues.put("_id", 1); // the execution is different if _id is 2
initialValues.put("columnA", "valueNEW");
int id = (int) yourdb.insertWithOnConflict("your_table", null, initialValues, SQLiteDatabase.CONFLICT_IGNORE);
if (id == -1) {
yourdb.update("your_table", initialValues, "_id=?", new String[] {"1"}); // number 1 is the _id here, update to variable for your code
}
Този пример предполага, че ключът на таблицата е зададен за колона "_id", че знаете записа _id и че вече има ред #1 (_id=1, columnA ="valueA", columnB ="valueB"). Ето разликата при използване на insertWithOnConflict с CONFLICT_REPLACE и CONFLICT_IGNORE
- CONFLICT_REPLACE ще презапише съществуващите стойности в други колони на нула (т.е. колона B ще стане NULL и резултатът ще бъде _id=1, columnA ="valueNEW", columnB =NULL). В резултат губите съществуващи данни и аз не ги използвам в кода си.
- CONFLICT_IGNORE ще пропусне SQL INSERT за съществуващия ви ред #1 и вие ще АКТУАЛИРАТЕ този ред в следващата стъпка, запазвайки съдържанието на всички останали колони (т.е. резултатът ще бъде _id=1, columnA ="valueNEW", колона B ="стойност B").
Когато се опитате да вмъкнете нов ред #2, който все още не съществува, кодът ще изпълни само SQL INSERT в първия израз insertWithOnConflict (т.е. резултатът ще бъде _id=2, columnA ="valueNEW", columnB =NULL).
Пазете се от тази грешка, която причинява неизправност на SQLiteDatabase.CONFLICT_IGNORE на API10 (и вероятно API11). Заявката връща 0 вместо -1, когато тествам на Android 2.2.
Ако не знаете ключа за запис _id или имате условие, което няма да създаде конфликт, можете да обърнете логиката към UPDATE или INSERT . Това ще запази вашия ключ за запис _id по време на АКТУАЛИЗИРАНЕ или ще създаде нов запис _id по време на INSERT.
int u = yourdb.update("yourtable", values, "anotherID=?", new String[]{"x"});
if (u == 0) {
yourdb.insertWithOnConflict("yourtable", null, values, SQLiteDatabase.CONFLICT_REPLACE);
}
Примерът по-горе предполага, че просто искате да АКТУАЛИЗИРАТЕ стойността на времевия клей в записа например. Ако първо извикате insertWithOnConflict, INSERT ще създаде нов запис _id поради разликата в условието за времеви печат.