Hallo zusammen,
ich habe ein mMn sehr merkwürdiges Problem bzgl. eines SQLite-INSERT.
Hier erstmal das Code-Schnipsel um das es geht, darunter dann die weitere Fehlerbeschreibung:
Ich bekomme von einem REST-Service Daten, die Prognosen für die nächsten 24 Stunden darstellen. Um mit diesen Daten etwas anfangen zu können, speicher ich sie in der SQLite-DB. Es lässt sich leider nicht vermeiden, dass ich von dem REST-Request Datensätze zurückgeliefert bekomme, die bereits in der Datenbank stehen. Beim Insert bekam ich dann immer die Fehlermeldung: "Error Code 19: Constraint blablabla". Um dieses Problem zu Umgehen, habe ich das INSERT-Stmt. um "OR IGNORE" erweitert. Dadurch sollten Datensätze die bereits vorhanden sind einfach ignoriert werden.
Nun besteht aber das Problem, dass auch die neuen Werte nicht in die DB geschrieben werden.
Hier mal ein Beispiel:
In meiner DB stehen Datensätze bis zu einem Timestamp: 1299916800 Preis: 25
Über meine Log-Ausgaben kann ich mir ja anzeigen lassen, welche Daten ich von dem Service geliefert bekomme.
Dies wären z.B.:
Also alles Werte die in der Zukunft liegen und auch noch nicht in der DB vorhanden sind.
Timestamp ist dabei der PK, der Preis kann sich beliebig oft wiederholen.
Liegt das nun evtl. an dem "IGNORE", dass das INSERT auch bei schon vorhandenem Preis ignoriert?
Irgendjemand eine Idee? :/ Vielen Dank schon mal!
ich habe ein mMn sehr merkwürdiges Problem bzgl. eines SQLite-INSERT.
Hier erstmal das Code-Schnipsel um das es geht, darunter dann die weitere Fehlerbeschreibung:
Code:
/**
* Fügt Timestamp-Preis-Kombinationen in die SQLite-DB ein. Im Anschluss daran, werden Datensätze, die älter als 7 Tage sind, gelöscht.
* @param JSONArray Aus den Array-Elementen müssen direkt JSONObjekte erstellt werden können, in der Form timestamp, price
*/
public void setSps(JSONArray jsonArray) {
String sql_insert = "INSERT OR IGNORE INTO " + SpsTbl.TABLE_NAME + "(" + SpsTbl.TIMESTAMP + "," + SpsTbl.PREIS + ")" +
" VALUES (?,?)";
String sql_delete = "DELETE FROM " +SpsTbl.TABLE_NAME +
" WHERE " + SpsTbl.TIMESTAMP + " <= STRFTIME('%s','now','-7 days')";
dbConn = db.getWritableDatabase();
try {
for(int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObj = jsonArray.getJSONObject(i);
Log.d(TAG, "dbConn.isDbLockedByCurrentThread(): " + dbConn.isDbLockedByCurrentThread());
Log.d(TAG, "dbConn.isDbLockedByOtherThreads(): " + dbConn.isDbLockedByOtherThreads());
Log.d(TAG, "dbConn.isOpen(): " + dbConn.isOpen());
Log.d(TAG, "dbConn.isReadOnly(): " + dbConn.isReadOnly());
Log.d(TAG, "jsonObj.getString(timestamp): " + jsonObj.getString("timestamp"));
Log.d(TAG, "jsonObj.getString(price): " + jsonObj.getString("price"));
dbConn.rawQuery(sql_insert, new String[] { jsonObj.getString("timestamp") , jsonObj.getString("price") });
}
dbConn.rawQuery(sql_delete, null);
} catch (JSONException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
Ich bekomme von einem REST-Service Daten, die Prognosen für die nächsten 24 Stunden darstellen. Um mit diesen Daten etwas anfangen zu können, speicher ich sie in der SQLite-DB. Es lässt sich leider nicht vermeiden, dass ich von dem REST-Request Datensätze zurückgeliefert bekomme, die bereits in der Datenbank stehen. Beim Insert bekam ich dann immer die Fehlermeldung: "Error Code 19: Constraint blablabla". Um dieses Problem zu Umgehen, habe ich das INSERT-Stmt. um "OR IGNORE" erweitert. Dadurch sollten Datensätze die bereits vorhanden sind einfach ignoriert werden.
Nun besteht aber das Problem, dass auch die neuen Werte nicht in die DB geschrieben werden.
Hier mal ein Beispiel:
In meiner DB stehen Datensätze bis zu einem Timestamp: 1299916800 Preis: 25
Über meine Log-Ausgaben kann ich mir ja anzeigen lassen, welche Daten ich von dem Service geliefert bekomme.
Dies wären z.B.:
Code:
03-11 10:04:42.590: DEBUG/SmartHomeDBInterface(1658): jsonObj.getString(timestamp): 1299918600
03-11 10:04:42.590: DEBUG/SmartHomeDBInterface(1658): jsonObj.getString(price): 25
...
03-11 10:04:42.590: DEBUG/SmartHomeDBInterface(1658): jsonObj.getString(timestamp): 1299920400
03-11 10:04:42.600: DEBUG/SmartHomeDBInterface(1658): jsonObj.getString(price): 25
Also alles Werte die in der Zukunft liegen und auch noch nicht in der DB vorhanden sind.
Timestamp ist dabei der PK, der Preis kann sich beliebig oft wiederholen.
Liegt das nun evtl. an dem "IGNORE", dass das INSERT auch bei schon vorhandenem Preis ignoriert?
Irgendjemand eine Idee? :/ Vielen Dank schon mal!