Autore Topic: Sqlite, update con execSql  (Letto 401 volte)

Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Sqlite, update con execSql
« il: 03 Febbraio 2015, 18:11:00 CET »
0
Nella documentazione di execSQL c'è scritto chiaramente:

Citazione
Execute a single SQL statement that is NOT a SELECT/INSERT/UPDATE/DELETE

Io però devo fare un'update in cui copio il valore di una colonna in un altro e non c'è modo di farlo usando i ContentValues che il metodo update prende come parametro.

Ho perciò usato una query raw in questo modo:

Codice (Java): [Seleziona]
        final String updateRawQuery =
        "UPDATE " + MetaData.APP_PROMOTION_TABLE +
        " SET " + MetaData.APP_PROMOTION_PROMOCNT_SHOWN + "=" + MetaData.APP_PROMOTION_PROMOCNT +
        " WHERE " + MetaData.APP_PROMOTION_PACKAGENAME + "='" + packagename + "'";

        mDB.execSQL(updateRawQuery);

L'ho provata e sembra funzionare, qualcuno sa se c'era un modo alternativo per farlo? (a parte la doppia query)
Avendo deliberatamente fatto qualcosa che da documentazione non avrei dovuto fare... in cosa incorro?
Cioé, qualcuno ha esperienze simili, per cui sul dispositivo XXX o su Androd 4.Y non funziona?

Ciao e grazie.

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Sqlite, update con execSql
« Risposta #1 il: 03 Febbraio 2015, 18:40:10 CET »
+1
Dovresti usare la rawQuery:

http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#rawQuery(java.lang.String, java.lang.String[])

Inviato dal mio Nexus 5 utilizzando Tapatalk

adb logcat | tee /tmp/logcat | grep TAG

Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Sqlite, update con execSql
« Risposta #2 il: 03 Febbraio 2015, 18:57:17 CET »
0
Grazie, in effetti è la più adatta. L'avevo usata altrove (per select complesse), non so perché non ho pensato di usarla qui.

 

Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Sqlite, update con execSql
« Risposta #3 il: 18 Febbraio 2015, 10:50:50 CET »
0
Aggiornamento: con rawQuery non funziona!
Avevo modificato il codice senza ritestarlo (brutta cosa...), me ne sono accorto solo ora.

Codice (Java): [Seleziona]
        final String updateRawQuery =
        "UPDATE " + MetaData.APP_PROMOTION_TABLE +
        " SET " + MetaData.APP_PROMOTION_PROMOCNT_SHOWN + "=" + MetaData.APP_PROMOTION_PROMOCNT +
        " WHERE " + MetaData.APP_PROMOTION_PACKAGENAME + "=?";

        mDB.execSQL(updateRawQuery, new String[]{packagename});

Aggiorna la tabella come mi aspetto.

Codice (Java): [Seleziona]
        final String updateRawQuery =
        "UPDATE " + MetaData.APP_PROMOTION_TABLE +
        " SET " + MetaData.APP_PROMOTION_PROMOCNT_SHOWN + "=" + MetaData.APP_PROMOTION_PROMOCNT +
        " WHERE " + MetaData.APP_PROMOTION_PACKAGENAME + "=?";

        mDB.rawQuery(updateRawQuery, new String[]{packagename});

Invece non funziona. E non è un problema di parametri.
Infatti questa funziona:

Codice (Java): [Seleziona]
        final String updateRawQuery =
        "UPDATE " + MetaData.APP_PROMOTION_TABLE +
        " SET " + MetaData.APP_PROMOTION_PROMOCNT_SHOWN + "=" + MetaData.APP_PROMOTION_PROMOCNT;

        mDB.execSQL(updateRawQuery);

e questa no:

Codice (Java): [Seleziona]
        final String updateRawQuery =
        "UPDATE " + MetaData.APP_PROMOTION_TABLE +
        " SET " + MetaData.APP_PROMOTION_PROMOCNT_SHOWN + "=" + MetaData.APP_PROMOTION_PROMOCNT;

        mDB.rawQuery(updateRawQuery, null);

Che la rawQuery possa essere usata solo con la SELECT?
In effetti torna un Cursor.

Tutto questo testato su Nexu5 con Lollipop 5.0.1
Il fatto che la documentazione dica di non usare execSql con Update, non mi rende tranquillo con la totalità delle versioni di API.


Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Sqlite, update con execSql
« Risposta #4 il: 18 Febbraio 2015, 12:00:13 CET »
0
Esistono due metodi execSQL, quello con un solo parametro può essere utilizzato con tutti i comandi SQL tranne la SELECT. Il vincolo che hai scritto nel primo post è valido solo per la execSQL con due parametri.

Inviato dal mio Nexus 5 utilizzando Tapatalk

adb logcat | tee /tmp/logcat | grep TAG

Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Sqlite, update con execSql
« Risposta #5 il: 18 Febbraio 2015, 12:12:46 CET »
0
Giusto, c'è scritto così. Mi pare alquanto strano, la composizione del comando con i parametri non capisco come possa influenzare il resto...

Cmq, ho cablato il parametro nella stringa per sicurezza.

Grazie.