2016-08-21 8 views
0

Meine Tabelle sieht wie folgt aus:SQLite Reihe von Zeitstempel löschen <x Tage

tx.executeSql(
    "CREATE TABLE IF NOT EXISTS mytable (
     msg_id UNSIGNED INT PRIMARY KEY ASC, 
     msg_when DATETIME, 
     msg_read INTEGER, 
     title TEXT, msg_text TEXT 
    )", 

ich Datensätze hinzufügen mit dieser Abfrage:

tx.executeSql(
    "INSERT OR REPLACE INTO mytable 
    (msg_id, msg_when, msg_read, title, msg_text) 
    VALUES 
    (?,?,?,?,?)", 

ich Zeilen löschen möchten, die über ‚x‘ Tage sind alt und ich benutze diese Abfrage, aber nichts wird gelöscht, der Erfolgs-Callback wird ohne Zeilen aufgerufen.

tx.executeSql(
    "DELETE FROM mytable 
    WHERE msg_when <= datetime('now', '-? days')", [days], 

Ich habe auch versucht:

var strQuery = "DELETE FROM mytable 
    WHERE msg_when <= datetime('now', '-" +days +" days')"; 
tx.executeSql(strQuery, 

und:

var strQuery = "DELETE FROM mytable 
    WHERE msg_when <= datetime('now', '-4 days')"; 
tx.executeSql(strQuery, 

Die Daten wie folgt aussieht:

json: {"status":"OK" 
,"count":1 
,"msg_id":"94" 
,"when":"2016-08-23 11:21:01" 
,"alerts":[ 
    {"msg_id":"44" 
    ,"title":"Medical Emergency" 
    ,"text":"Heart Attack" 
    ,"msg_when":"2016-08-05 14:52:03" 
    } 
    ] 
} 

Andere als Reihen von Datum zu löschen, ist alles funktioniert einwandfrei. Irgendwelche Vorschläge, was ich tun kann, um das Löschen zu beheben?

Antwort

0

Ok, es gibt tatsächlich zwei Tricks, um diese zu lösen.

Erstens, wenn Sie Ihr Feld als Datetime deklarieren (was nichts anderes als eine ganze Zahl ist), werden Sie dies nie zum Laufen bringen. Nicht unter iOS 9.x, nicht unter Android und nicht unter Chrome 52.0.2743.116 m (64-bit) unter Windows 10.

Was Sie tun müssen, ist speichern Sie Ihr Datum als TEXT-Feld und speichern Sie Ihre Datetime als a Zeichenfolge wie folgt:

tx.executeSql("CREATE TABLE IF NOT EXISTS mytable (msg_id UNSIGNED INT PRIMARY KEY ASC, msg_when TEXT, msg_read INTEGER, title TEXT, msg_text TEXT)", 

als nächstes müssen Sie Ihren Vergleich in (Klammern) wickeln, so dass sQLite behandelt es als eine Formel und macht die mathematischen Conversions für Sie ... wie folgt aus:

tx.executeSql(DELETE FROM mytable WHERE (msg_when <= datetime('now', '-4 days'))", 

Beachten Sie die Klammern vor der Spalte (msg_when und nach der schließenden Klammer auf datetime)) func tion.

2

Das Problem mit der DELETE-Anweisung ist, dass die Parametervorlage (?) innerhalb des Zeichenfolgenliterals liegt und daher ignoriert wird. Sie müssen den Verkettungsoperator (||) verwenden:

DELETE FROM mytable WHERE msg_when <= datetime('now', '-' || ? || ' days') 
+0

Das löst das Problem nicht. Als eine FYI habe ich auch versucht: DELETE FROM meine Tabelle WHERE msg_when <= datetime ('jetzt', '- "+ Tage +" Tage') und das baut die richtige Zeichenfolge (in meinem Fall '-4 Tage' aber ich haben msgs, die 3+ Wochen alt sind – ppetree

+0

Wenn es nicht funktioniert, müssen Sie einige Beispieldaten in Ihre Frage einbeziehen Beachten Sie, dass Datum/Uhrzeit in SQLite als ISO 8601-Zeichenfolgen gespeichert werden, und das ist, was die Funktion "Datum" zurückgibt Wenn Ihre Daten nicht in diesem Format vorliegen, wird es nicht funktionieren. Beachten Sie, dass SQLite ** das Format ** nicht erzwingt - genauso wie es keine Spaltentypen erzwingt usw. – cartant

+0

Danke für die Info. Die Datetime ist genau wie von mysql als JSON-String 'JJJJ-MM-TT hh: mm: ss' bekannt, msg_when. ;-) Sie werden als solche abgefragt und angezeigt. – ppetree