Java [Android][SQLite?] execSQL(INSERT...) funkt. nicht in der App, aber in der Konsole

FaKer

Cadet 4th Year
Registriert
Jan. 2004
Beiträge
100
Tag zusammen,

ja, ich schon wieder... :)

Ups, im Thread-Namen sollte das eigentlich ein UPDATE sein und kein INSERT... langsam macht sich das lange vor der Kiste hocken bemerkbar Oo
Nachdem es das letzte mal Probleme mit dem Insert gab, macht nun ein Update Probleme.

Ich bekomme von einem REST-Service im JSON-Format eine ganze Reihe an Daten. Diese sollen Vorhandene Datensätze in meiner Datenbank teilweise updaten.

Code:
public void setDetails(JSONArray jsonArray) {
    int timestamp = 0;
    String sql = null;
    String spaltenName = null;
    String uuid = null;
    String schluessel = null, value = null;
    
    dbConn = db.getWritableDatabase();
    
    try {
      for(int i = 0; i < jsonArray.length(); i++) {        
        JSONObject details = jsonArray.getJSONObject(i);
        value = details.getString("value");
        timestamp = details.getInt("timestamp");
        
        JSONObject detailsPK = details.getJSONObject("detailsPK");
        uuid = detailsPK.getString("uuid");
        schluessel = detailsPK.getString("schluessel");
                        
        if(schluessel.equals("power")) spaltenName = DetailsTbl.POWER;
          else if(schluessel.equals("State")) spaltenName = DetailsTbl.STATE;
            else if(schluessel.equals("Phase")) spaltenName = DetailsTbl.PHASE;
              else if(schluessel.equals("Cooking Function")) spaltenName = DetailsTbl.FUNCTION;
                else if(schluessel.equals("Temperature")) spaltenName = DetailsTbl.TEMP;
                  else spaltenName = null;
        
        Log.d(TAG, "schluessel: " + schluessel);
        Log.d(TAG, "value: " + value);
        Log.d(TAG, "uuid: " + uuid);
        Log.d(TAG, "timestamp: " + timestamp);
        Log.d(TAG, "spaltenName: " + spaltenName);
        if(spaltenName == null) {
          sql = null;
        } else {
          sql = "UPDATE " + DetailsTbl.TABLE_NAME + " " +
          "SET " + spaltenName + " = '" + value + "' , " + DetailsTbl.TIMESTAMP + " = '" + timestamp + "' " +
          "WHERE " + DetailsTbl.UUID + " = '" + uuid + "'";
          Log.d(TAG, "sql: " + sql);
          Log.d(TAG, "*************************");
          dbConn.execSQL(sql);
        }
      } 
    } catch (JSONException e) {
      e.printStackTrace();
    } catch (Exception e) {
      e.printStackTrace(); 
    }
  }

Die Log-Ausgabe für zwei Schleifendurchläufe sieht so aus:

Code:
schluessel: power
value: 4.0
uuid: ec27d88e-378c-4fb0-8749-b174902a2e28
timestamp: 1297965132
spaltenName: power
sql: UPDATE details SET power = '4.0' , timestamp = '1297965132' WHERE uuid = 'ec27d88e-378c-4fb0-8749-b174902a2e28'
*************************
schluessel: power
value: 0.0
uuid: ab9519db-7a14-4e43-ac3a-ade723802194
timestamp: 1297965132
spaltenName: power
sql: UPDATE details SET power = '0.0' , timestamp = '1297965132' WHERE uuid = 'ab9519db-7a14-4e43-ac3a-ade723802194'
*************************

Wenn ich das SQL-Stmt. aus dem Log kopiere, und in der Konsole einfüge, funktionierts!
Hab's auch schon mit ContentValues und update(...) versucht - selbes Ergebnis...

Irgendjemand eine Idee woran das liegt und was ich dagegen tun könnte?

Vielen Dank schon mal für eure Hilfe!
VG
 
Zuletzt bearbeitet:
Hm das sieht soweit richtig aus. Könnte es sein, dass du irgendwo anders in deiner Anwendung noch auf die Datenbank zugreifst? Also vlt nen Cursor offen hast oder so.

EDIT: Am besten du führst mal vor dem execSQL die isDbLockedByOtherThreads() und isDbLockedByCurrentThread() Funktionen aus und schaust ob die True zurückliefern.
 
Zuletzt bearbeitet:
das nächste mal schreib ich die gleich persönlich an ;)

die Datenbank war noch geblockt. Ich habe eine ExpandbaleList in der der ChildCursor (CursorTreeAdapter) noch nicht geschlossen war.
Es funktioniert...

Vielen Dank! Hast mir heut schon das zweite Mal super geholfen! :)
 
Ich habe vor kurzem ein wenig mit SQLite gearbeitet, daher fiel mir das hier grade so ein. Wenn nämlich eine SQLite Datenbank blockiert ist, liefert dein Befehl einen Fehlerwert, der hier aber anscheinend von Android geschluckt wird.
Ich würde dir empfehlen, die update() Methode zu benutzen und den Rückgabewert zu prüfen. Wenn der 1 ist, dann weisst du, dass tatsächlich eine Row geupdatet wurde.

EDIT: Wobei, ich sehe grade in Google, dass Android wohl dann eine Exception wirft, wenn die Datenbank BUSY ist. Also brauchst du es doch nicht mit update zu machen.
 
Zuletzt bearbeitet:
Zurück
Oben