SQLite
 sql >> база данни >  >> RDS >> SQLite

Вмъкване или актуализиране на Android SQLite

Вярвам, че питате как да ВМЕСЕТЕ нови редове или АКТУАЛИЗИРАТЕ съществуващите си редове в една стъпка. Въпреки че това е възможно в един суров 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 поради разликата в условието за времеви печат.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Показване на данни в RecyclerView

  2. Вмъкване на текуща дата и час в базата данни на SQLite

  3. Ще се влоши ли производителността на SQLite, ако размерът на базата данни е по-голям от 2 гигабайта?

  4. Как да възстановите базата данни на Sqlite след архивиране на Android

  5. Открит е теч на база данни на SQLite