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

-1
java progammera 2 Jän. 2016 im 20:48

3 Antworten

Beste Antwort
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')
1
CL. 3 Jän. 2016 im 09:33

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)

4
Mohammed Aouf Zouag 2 Jän. 2016 im 17:50

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);
0
GIRIDHARAN 2 Jän. 2016 im 17:52