Autore Topic: Insert or update  (Letto 799 volte)

Offline dessorry

  • Utente normale
  • ***
  • Post: 230
  • Who lived hoping died craping
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire HD
  • Play Store ID:
    dessorry
  • Sistema operativo:
    Windows, Ubuntu, Kubuntu
Insert or update
« il: 22 Gennaio 2011, 12:48:47 CET »
0
Come posso fare con SQLITE a fare una operazione del tipo INSERT OR UPDATE?

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Insert or update
« Risposta #1 il: 22 Gennaio 2011, 13:00:43 CET »
0
c'è il metodo apposito SQLiteDatabase | Android Developers
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline dessorry

  • Utente normale
  • ***
  • Post: 230
  • Who lived hoping died craping
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire HD
  • Play Store ID:
    dessorry
  • Sistema operativo:
    Windows, Ubuntu, Kubuntu
Re:Insert or update
« Risposta #2 il: 22 Gennaio 2011, 13:05:12 CET »
0
Intendi questo:
Codice: [Seleziona]
public long insertWithOnConflict (String table, String nullColumnHack, ContentValues initialValues, int conflictAlgorithm) ?

Questo metodo però mi ritorno la ID della nuova riga se non esisteva oppure la chiave primaria (ID ?!) di quella già presente.
Dal numero intero della ID ritengo difficile riconoscere se è un ID già inserito oppure un nuovo ID.

Offline dessorry

  • Utente normale
  • ***
  • Post: 230
  • Who lived hoping died craping
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire HD
  • Play Store ID:
    dessorry
  • Sistema operativo:
    Windows, Ubuntu, Kubuntu
Re:Insert or update
« Risposta #3 il: 22 Gennaio 2011, 16:34:01 CET »
0
Marzullo docet  :D

Ho risolto così:
Codice: [Seleziona]

int res=mDb.update(...);
if (res==0)
        mDb.insert(...);


Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Insert or update
« Risposta #4 il: 03 Febbraio 2015, 16:54:34 CET »
0
Nicola_D, intendi dire che la insert si comporta già come una insert or update? Cioé se trova un conflitto fa l'update della riga?

Io ho usato la soluzione di dessorry, ma se fosse possibile vorrei evitare la doppia query.

Ciao.

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Insert or update
« Risposta #5 il: 03 Febbraio 2015, 18:27:35 CET »
0
Nicola_D, intendi dire che la insert si comporta già come una insert or update? Cioé se trova un conflitto fa l'update della riga?

Io ho usato la soluzione di dessorry, ma se fosse possibile vorrei evitare la doppia query.

Ciao.
non l'ho provato ( e il mio post è vecchio per ricordarmi) ma a vedere dalla documentazione se imposti il giusto conflictalgorithm potrebbe essere (anche se a essere preciso non credo, visto che nel link sotto parla di righe che creano conflitti, non della riga che stai inserendo..)
SQLiteDatabase | Android Developers
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Insert or update
« Risposta #6 il: 03 Febbraio 2015, 18:38:44 CET »
+1
Ah, dicevi la versione WithConflict.

L'ho usata in altri casi, se metti CONFLICT_REPLACE aggiunge la riga se non la trova. Se va in conflitto (per chiave primaria/unica) allora cancella la riga vecchia e aggiunge quella nuova.
Se però nella riga vecchia hai dei valori di qualche colonna che intendi mantenere, li perdi, vengono reimpostati al default.

Alla fine ho usato il metodo di dessorry. Io avevo inizialmente fatto il contrario (Insert, se fallisce Update) ma il suo è più efficiente (nel caso gli update siano più delle insert).

Ciao.

Offline Cleon I

  • Nuovo arrivato
  • *
  • Post: 49
  • Sono l'imperatore della galassia
  • Respect: +2
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG L70, Nexus 7 2013
  • Sistema operativo:
    LinuxMint Cinnamon 17.1
Re:Insert or update
« Risposta #7 il: 04 Febbraio 2015, 11:35:02 CET »
0
scusate vado un pò offtopic

c'è un metodo che ricalcola le righe di _id
mi spiego meglio:

- inserisco la prima riga id = 1
- inserisco la seconda id = 2
- insericco una terza id = 3
- cancello la seconda (ho 2 righe una con id 1 e una con id 3)
- inserisco una nuova riga id = 4 (giusto?)

se volessi id 2 oppure ricalcolare gli id?

ps: dimenticavo la colonna _id è un primary key autoincrement
« Ultima modifica: 04 Febbraio 2015, 11:36:51 CET da Cleon I »