Autore Topic: Problema UPDATE sql statement  (Letto 587 volte)

Offline adolfinho

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
Problema UPDATE sql statement
« il: 09 Maggio 2013, 13:51:15 CEST »
0
Ciao a tutti!
Innanzitutto il pezzo di codice:
public void updatePositiveFeedbackUser(String userId,int positiveFeedback){
               
      String sqlQuery = "UPDATE users SET positiveFeedback="+positiveFeedback+" WHERE idUser='"+userId+"'";     
      //getWritableDatabase().execSQL(sqlQuery);
      getWritableDatabase().rawQuery(sqlQuery, null);
      Log.d(TAG,sqlQuery);
       
   }
Qualcuno mi sa spiegare la differenza di funzionamento tra getWritableDatabase().execSQL(sqlQuery) e getWritableDatabase().rawQuery(sqlQuery, null)?
Il problema che ho è questo: se utilizzo la prima opzione, l'app va in crash e il logCat mi dice che tento di scrivere su un database di sola lettura (ma io ne ho chiesto uno writable!!); se utilizzo la seconda opzione l'app NON va in crash,però ho potuto capire che il db non viene aggiornato (nel logcat inoltre ho stampato la query ed è giusta).

Sapreste darmi una mano? Grazie!

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Problema UPDATE sql statement
« Risposta #1 il: 09 Maggio 2013, 14:00:45 CEST »
0
Per la raqQuery, poichè ritorna comunque un Cursor, probabilmente supporta a pieno solo la SELECT.

Per la execSQL, leggendo nella documentazione ufficiale:
( SQLiteDatabase | Android Developers )

Citazione
public void execSQL (String sql, Object[] bindArgs)

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

For UPDATE statements, use any of the following instead.

    update(String, ContentValues, String, String[])
    updateWithOnConflict(String, ContentValues, String, String[], int)

NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline adolfinho

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
Re:Problema UPDATE sql statement
« Risposta #2 il: 09 Maggio 2013, 14:24:38 CEST »
0
Intanto ti ringrazio! Ho modificato in questa maniera:

public void updatePositiveFeedbackUser(String userId,int positiveFeedback){
               
        ContentValues values = new ContentValues();
             values.put("positiveFeedback", positiveFeedback);
   
            getWritableDatabase().update("users", values,UsersTable.ID_USER+"=?", new String []{userId});
    }
         

Sotto ho allegato il logCat,che oltre a dirmi che la query è errata(magari mi date una dritta anche su questo),mi restituisce ancora il problema di readonly database. Soluzioni?



05-09 14:23:00.201: E/Database(3464): Error updating positiveFeedback=4 using UPDATE users SET positiveFeedback=? WHERE idUser=?
05-09 14:23:00.221: D/AndroidRuntime(3464): Shutting down VM
05-09 14:23:00.221: W/dalvikvm(3464): threadid=1: thread exiting with uncaught exception (group=0x40018560)
05-09 14:23:00.251: E/AndroidRuntime(3464): FATAL EXCEPTION: main
05-09 14:23:00.251: E/AndroidRuntime(3464): android.database.sqlite.SQLiteException: error code 8: attempt to write a readonly database
05-09 14:23:00.251: E/AndroidRuntime(3464):    at android.database.sqlite.SQLiteStatement.native_execute(Native Method)
05-09 14:23:00.251: E/AndroidRuntime(3464):    at android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:61)
05-09 14:23:00.251: E/AndroidRuntime(3464):    at android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1727)
05-09 14:23:00.251: E/AndroidRuntime(3464):    at android.database.sqlite.SQLiteDatabase.update(SQLiteDatabase.java:1656)
05-09 14:23:00.251: E/AndroidRuntime(3464):    at com.example.databaseTorcia.DatabaseHelper.updatePositiveFeedbackUser(DatabaseHelper.java:155)
05-09 14:23:00.251: E/AndroidRuntime(3464):    at com.example.torcia.SearchCat$2$1.onClick(SearchCat.java:211)
05-09 14:23:00.251: E/AndroidRuntime(3464):    at android.view.View.performClick(View.java:2506)
05-09 14:23:00.251: E/AndroidRuntime(3464):    at android.view.View$PerformClick.run(View.java:9112)
05-09 14:23:00.251: E/AndroidRuntime(3464):    at android.os.Handler.handleCallback(Handler.java:587)
05-09 14:23:00.251: E/AndroidRuntime(3464):    at android.os.Handler.dispatchMessage(Handler.java:92)
05-09 14:23:00.251: E/AndroidRuntime(3464):    at android.os.Looper.loop(Looper.java:130)
05-09 14:23:00.251: E/AndroidRuntime(3464):    at android.app.ActivityThread.main(ActivityThread.java:3835)
05-09 14:23:00.251: E/AndroidRuntime(3464):    at java.lang.reflect.Method.invokeNative(Native Method)
05-09 14:23:00.251: E/AndroidRuntime(3464):    at java.lang.reflect.Method.invoke(Method.java:507)
05-09 14:23:00.251: E/AndroidRuntime(3464):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
05-09 14:23:00.251: E/AndroidRuntime(3464):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
05-09 14:23:00.251: E/AndroidRuntime(3464):    at dalvik.system.NativeStart.main(Native Method)

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Problema UPDATE sql statement
« Risposta #3 il: 09 Maggio 2013, 15:22:48 CEST »
0
Credo che l'errore sia uno solo, cioè che la query di update fallisce perchè il DB è readonly.

Unico caso che mi viene in mente è se per caso il file del database risiede su SDCARD e non hai messo il permesso WRITE_EXTERNAL_STORAGE.

Qual'è di preciso la tua configurazione?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline adolfinho

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
Re:Problema UPDATE sql statement
« Risposta #4 il: 09 Maggio 2013, 15:29:42 CEST »
0
Ci avevo già pensato...Il db però è in memoria interna,in ogni caso nel mio manifest è già presente il permesso di WRITE_EXTERNAL_STORAGE.

Un altro problema che mi veniva in mente è: può essere che da qualche parte mi dimentico il db aperto? Risposta: non credo che ciò importi,in quanto la mia update la faccio con getWritableDatabase.update(.....).

Ps:il fatto che lo statement non venga formato bene (ovvero mi lascia i ?) sarà comunque legato al problema di cui sopra?

Ringrazio di nuovo per la risposta. Sta cosa mi sta facendo impazzire...


Post unito: 09 Maggio 2013, 16:13:19 CEST
Scoperto l'arcano!!

In pratica,la mia app crea un db nella cartella dell'app. Ho quindi voluto popolare il db MANUALMENTE, ovvero ho preso il file .db, copiato sul pc,  aggiunto le righe di prova e successivamente ricopiato il file all'interno della cartella dell'app.

Risultato: questo procedimento crea dei pasticci (forse a causa del programmino che ho usato). Ho quindi eliminato il db e l'ho fatto ricreare rimandando l'app in run. Ora riesco ad accedere al db tranquillamente anche in modalità di scrittura.

Sono sicuro al 99.9 % che il problema è questo,pertanto il topic lo dichiaro risolto!
Grazie bradipao per il supporto!
« Ultima modifica: 09 Maggio 2013, 16:13:19 CEST da adolfinho, Reason: Merged DoublePost »