Ich habe eine Tabelle mit einem Datumsfeld. Ich habe das Datumsfeld beim Erstellen der Tabelle als Ganzzahl gespeichert. Der Benutzer wählt das Datum mit einer Datumsauswahl aus und das Datum wird im folgenden Format gespeichert: TT / MM / JJ. Ich möchte die Zeilen in der Tabelle zurückgeben, in denen Datumsangaben im Feld Datum> aktuelles Datum angegeben sind. Ich habe die folgende Abfrage versucht:
public Cursor getUpcomAp ( ) {
SQLiteDatabase db = this.getWritableDatabase();
Cursor res = db.rawQuery (" select * from " + TABLE_NAME2 + "where strftime('%d.%m.%Y', date) > now.strftime('%d.%m.%Y')" , null);
return res;
}
Die Anwendung stürzt ab, wenn ich auf die Schaltfläche klicke, mit der diese Abfrage ausgeführt wird. Hier ist die Logcat-Ausgabe:
01-02 13:09:39.250: D/(918): HostConnection::get() New Host Connection established 0xb882df30, tid 918
01-02 13:09:39.400: W/EGL_emulation(918): eglSurfaceAttrib not implemented
01-02 13:09:39.410: D/OpenGLRenderer(918): Enabling debug mode 0
01-02 13:09:57.690: D/dalvikvm(918): GC_FOR_ALLOC freed 109K, 6% free 3263K/3448K, paused 197ms, total 210ms
01-02 13:09:58.570: W/EGL_emulation(918): eglSurfaceAttrib not implemented
01-02 13:10:01.770: E/SQLiteLog(918): (1) near "(": syntax error
01-02 13:10:01.780: D/AndroidRuntime(918): Shutting down VM
01-02 13:10:01.780: W/dalvikvm(918): threadid=1: thread exiting with uncaught exception (group=0xb1a5eba8)
01-02 13:10:01.820: E/AndroidRuntime(918): FATAL EXCEPTION: main
01-02 13:10:01.820: E/AndroidRuntime(918): Process: com.example.appointapp, PID: 918
01-02 13:10:01.820: E/AndroidRuntime(918): android.database.sqlite.SQLiteException: near "(": syntax error (code 1): , while compiling: select * from appointments_table where strftime ('%d.%m.%Y', date) > now.strftime('%d.%m.%Y')
01-02 13:10:01.820: E/AndroidRuntime(918): at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
01-02 13:10:01.820: E/AndroidRuntime(918): at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
01-02 13:10:01.820: E/AndroidRuntime(918): at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
01-02 13:10:01.820: E/AndroidRuntime(918): at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
01-02 13:10:01.820: E/AndroidRuntime(918): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
01-02 13:10:01.820: E/AndroidRuntime(918): at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
01-02 13:10:01.820: E/AndroidRuntime(918): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
01-02 13:10:01.820: E/AndroidRuntime(918): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
01-02 13:10:01.820: E/AndroidRuntime(918): at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253)
01-02 13:10:01.820: E/AndroidRuntime(918): at com.example.appointapp.DatabaseHelper.getUpcomAp(DatabaseHelper.java:86)
01-02 13:10:01.820: E/AndroidRuntime(918): at com.example.appointapp.AppointFragment$5.onClick(AppointFragment.java:189)
01-02 13:10:01.820: E/AndroidRuntime(918): at android.view.View.performClick(View.java:4438)
01-02 13:10:01.820: E/AndroidRuntime(918): at android.view.View$PerformClick.run(View.java:18422)
01-02 13:10:01.820: E/AndroidRuntime(918): at android.os.Handler.handleCallback(Handler.java:733)
01-02 13:10:01.820: E/AndroidRuntime(918): at android.os.Handler.dispatchMessage(Handler.java:95)
01-02 13:10:01.820: E/AndroidRuntime(918): at android.os.Looper.loop(Looper.java:136)
01-02 13:10:01.820: E/AndroidRuntime(918): at android.app.ActivityThread.main(ActivityThread.java:5017)
01-02 13:10:01.820: E/AndroidRuntime(918): at java.lang.reflect.Method.invokeNative(Native Method)
01-02 13:10:01.820: E/AndroidRuntime(918): at java.lang.reflect.Method.invoke(Method.java:515)
01-02 13:10:01.820: E/AndroidRuntime(918): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
01-02 13:10:01.820: E/AndroidRuntime(918): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
01-02 13:10:01.820: E/AndroidRuntime(918): at dalvik.system.NativeStart.main(Native Method)
Bitte helfen Sie
3 Antworten
where strftime('%d.%m.%Y', date) > now.strftime('%d.%m.%Y')
strftime()
möchte immer den Datenwert als Parameter. (Und now
ist kein spezieller Spaltenname; nur die Zeichenfolge 'now'
wird speziell behandelt.)
Darüber hinaus gehört dd/mm/yy
nicht zu den unterstützten Datumsformaten. strftime()
gibt nur NULL für Ihre Werte zurück. Außerdem kann eine Zeichenfolge im Format dd.mm.yyyy
nicht korrekt mit Zeichenfolgenvergleichen verglichen werden.
Speichern Sie die Daten in einem unterstützten Format wie yyyy-mm-dd
. Dann können Sie die Werte direkt vergleichen:
where date > date('now')
Sie benötigen ein Leerzeichen vor WHERE
:
"where strftime('%d.%m.%Y', date)....
Sollte sein
" where strftime('%d.%m.%Y', date)...
(SELECT * FROM table_nameWHERE...
, dies ist das Ergebnis, das Sie hatten)
Muss ein Leerzeichen zwischen TABLE_NAME2
und where
geben:
Cursor res = db.rawQuery (" select * from " + TABLE_NAME2 + " where strftime('%d.%m.%Y', date) > now.strftime('%d.%m.%Y')" , null);
Neue Fragen
android
Android ist Googles mobiles Betriebssystem, mit dem digitale Geräte (Smartphones, Tablets, Automobile, Fernseher, Wear, Glass, IoT) programmiert oder entwickelt werden. Verwenden Sie für Themen im Zusammenhang mit Android Android-spezifische Tags wie Android-Intent, Android-Aktivität, Android-Adapter usw. Verwenden Sie für andere Fragen als Entwicklung oder Programmierung, die sich jedoch auf das Android-Framework beziehen, diesen Link: https: // android.stackexchange.com.