Forum: PC-Programmierung SQLite-Frage - Statement


von SQElitär (Gast)


Lesenswert?

Guten Abend!

Ich bin mir sicher, dass man mir hier im Forum helfen kann.

Ich suche ein SQL-Statement, welches in die dritte Spalte meiner 
SQL-Tabelle "Test" einen Wert schreibt, sofern der Wert in Spalte "1" 
beträgt:

Die Tabelle besteht aus drei Spalten:
 - Datum
 - Uhrzeit_1
 - Uhrzeit_2

Sofern "Datum" dem heutigen Datum entspricht, soll in den jeweiligen 
Eintrag in "Uhrzeit_2" die jetzige Uhrzeit eingetragen werden.

So habe ich zumindest die Tabelle generiert:
1
CREATE TABLE IF NOT EXISTS Test(Datum DATE, Uhrzeit_1 TIME, Uhrzeit_2 TIME);

Nun muss zum Schreiben in die Datenbank aber wie beschrieben noch ein 
Statement angefügt werden, damit überhaupt in die Datenbank geschrieben 
werden kann...
1
INSERT INTO Test VALUES  ...


Könnt ihr mir helfen? :-(


Vielen Dank!

von SQElitär (Gast)


Lesenswert?

Nachtrag:

Also...sofern das Datum (in Spalte-1) mit dem heutigen Datum 
übereinstimmt, soll in Spalte-3 die jetzige Uhrzeit geschrieben werden

von Peter II (Gast)


Lesenswert?

geht es um ein einfügen oder ein updaten?

von SQElitär (Gast)


Lesenswert?

Es geht um das Einfügen des aktuellen Datums in Spalte-3, welches vorher 
nicht in der jeweiligen "Zelle" stand.

von SQElitär (Gast)


Lesenswert?

*Uhrzeit...

ich bin schon ganz durchgebrannt.

von Peter II (Gast)


Lesenswert?

warum kannst du das nicht im dem code machen, wo du das insert machst?

von SQElitär (Gast)


Lesenswert?

Ich habe zwei Button...

Um die GUI etwas zu erläutern:


Button-1 macht folgendes:
Schreibe in Spalte-1 das jetzige Datum,
Schreibe in Spalte-2 die jetzige Uhrzeit;

Button-2 soll folgendes machen:
Schreibe in Spalte-3 die jetzige Uhrzeit, ohne Spalte-1 und Spalte-2 zu 
überschreiben, sofern Spalte-1 dem heutigen Datum entspricht.

Nach dem Drücken auf Button-2 sollen also 3 Werte vorliegen.

von Peter II (Gast)


Lesenswert?

SQElitär schrieb:
> Button-2 soll folgendes machen:
> Schreibe in Spalte-3 die jetzige Uhrzeit, ohne Spalte-1 und Spalte-2 zu
> überschreiben, sofern Spalte-1 dem heutigen Datum entspricht.

OnButton
  update Test set Spalte-3 = {aktuelle Zeit} where Spalte-1 = {aktuelles 
Datum}

versteht das Problem scheinbar nicht.

von SQElitär (Gast)


Lesenswert?

Das Programm läuft gegen die Wand:
1
final SQLiteDatabase db = openOrCreateDatabase("StudentDB", Context.MODE_PRIVATE, null);
2
        db.execSQL("CREATE TABLE IF NOT EXISTS Zeiterfassung(Datum DATE, Kommen TIME, Gehen TIME, Arbeitszeit TIME);");
3
4
        //final TextView txt = (TextView) findViewById(R.id.textView1);
5
        // final EditText txt_kommen = (EditText) findViewById(R.id.txt_Kommen);
6
        //kommen.setText("Play");
7
8
        kommen.setOnClickListener(new View.OnClickListener()
9
        {
10
            @Override
11
            public void onClick(View v)
12
            {
13
               // db.execSQL("INSERT INTO Zeiterfassung VALUES('DATE('now'),TIME('now')';");
14
                Toast.makeText(getApplicationContext(), "Kommen-Zeit wurde gebucht!", Toast.LENGTH_LONG).show();
15
            }
16
        });
17
18
19
20
        gehen.setOnClickListener(new View.OnClickListener()
21
        {
22
            @Override
23
            public void onClick(View v)
24
            {
25
                db.execSQL("UPDATE Zeiterfassung SET Gehen = TIME('now') WHERE Datum = DATE('now');");
26
                Toast.makeText(getApplicationContext(), "Gehen-Zeit wurde gebucht!", Toast.LENGTH_LONG).show();
27
            }
28
        });

von Clemens L. (c_l)


Lesenswert?

SQElitär schrieb:
> Das Programm läuft gegen die Wand

Konkreter bitter!
Aber solange das INSERT auskommentiert ist, passiert gar nichts.

von SQElitär (Gast)


Lesenswert?

>Konkreter bitte

Beim Drücken auf "Kommen" kommt folgende Meldung in der IDE:
1
 E/SQLiteLog: (1) near "now": syntax error
2
12-24 09:42:45.171 7790-7790/com.example.jk.zeiterfassung D/AndroidRuntime: Shutting down VM
3
12-24 09:42:45.181 7790-7790/com.example.jk.zeiterfassung E/AndroidRuntime: FATAL EXCEPTION: main
4
                                                                            Process: com.example.jk.zeiterfassung, PID: 7790
5
                                                                            android.database.sqlite.SQLiteException: near "now": syntax error (code 1): , while compiling: INSERT INTO Zeiterfassung VALUES('DATE('now'),TIME('now')';
6
                                                                            #################################################################
7
                                                                            Error Code : 1 (SQLITE_ERROR)
8
                                                                            Caused By : SQL(query) error or missing database.
9
                                                                              (near "now": syntax error (code 1): , while compiling: INSERT INTO Zeiterfassung VALUES('DATE('now'),TIME('now')';)
10
                                                                            #################################################################

von Jan H. (j_hansen)


Lesenswert?

Die Datenbank wäre sicher dankbar darüber zu wissen, in welche Felder 
(Spalten) sie denn die Werte schreiben soll. Verschachtelte einfache 
Hochkomma wird sie wahrscheinlich auch nicht mögen.

von Peter II (Gast)


Lesenswert?

SQElitär schrieb:
> E/SQLiteLog: (1) near "now": syntax error

das stimmt dann das quoting nicht.

eventuell so:
1
db.execSQL("UPDATE Zeiterfassung SET Gehen = TIME(\'now\') WHERE Datum = DATE(\'now\');");

von Roland P. (pram)


Lesenswert?

Achtung: Wenn du Datum und Uhrzeit in zwei Spalten speicherst, solltest 
du auch die zugehörige Zeitzone dazu abspeichern.

Oder wie willst du erkennen ob bei einem Eintrag von 30.10.2016 02:30:00 
Sommerzeit oder Winterzeit war?

Falls mit den Zeitpunkten gerechnet werden soll (wovon ich ausgehe) 
würde ich empfehlen alles auf GMT-Timestamps zurück zu führen und bei 
der Anzeige passend umrechnen.

VG
Roland

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

SQElitär schrieb:
> (near "now": syntax error (code 1): , while compiling: INSERT INTO
> Zeiterfassung VALUES('DATE('now'),TIME('now')';)

Da fehlt eine Klammer.
1
db.execSQL("INSERT INTO Zeiterfassung  VALUES('DATE('now'),TIME('now')';");

Zähle die öffnenden und die schließenden Klammern
1
db.execSQL("INSERT INTO Zeiterfassung  VALUES('DATE('now'),TIME('now')';");
2
Ö         1                                  2     3           4 
3
S                                                        1           2   3

von SQElitär (Gast)


Lesenswert?

Hallo zusammen,

>db.execSQL("UPDATE Zeiterfassung SET Gehen = TIME(\'now\') WHERE Datum = 
>DATE(\'now\');");
Ok, jetzt funktioniert das! Danke!


>Achtung: Wenn du Datum und Uhrzeit in zwei Spalten speicherst, solltest
>du auch die zugehörige Zeitzone dazu abspeichern.
Ja, dieses Problem versuchte ich mit folgender Zeile Code zu lösen. 
Leider erscheinen die beiden Uhrzeiten nicht in der richtigen Zeitzone 
(1 Stunde zu früh).
Wisst ihr, warum trotz dieser Zeile die Uhrzeit falsch gezeigt wird?
1
 db.execSQL("CREATE TABLE IF NOT EXISTS Zeiterfassung(Datum DATETIME DEFAULT (DATETIME(CURRENT_TIMESTAMP, \'LOCALTIME\')), Kommen DATETIME DEFAULT (DATETIME(CURRENT_TIMESTAMP, \'LOCALTIME\')), Gehen DATETIME DEFAULT (DATETIME(CURRENT_TIMESTAMP, \'LOCALTIME\')), Arbeitszeit TEXT);");

Außerdem liefert mir beim Drücken auf "Zeiten ausgeben" die Textbox 
nicht ALLE Einträge der Datenbank zurück sondern immer nur den letzten 
:-(
1
if (c.getCount() == 0) {
2
                    return;
3
                }
4
                StringBuffer buffer = new StringBuffer();
5
                while (c.moveToNext())
6
                {
7
                        buffer.append(c.getString(0) + "   ");
8
                        buffer.append(c.getString(1) + "   ");
9
                        buffer.append(c.getString(2) + "\n");
10
                        txt_zeitnachweis.setText(buffer.toString());
11
                }
12
}

Auch das verstehe ich nicht..
Danke!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

SQElitär schrieb:
> txt_zeitnachweis.setText(buffer.toString());

Das überschreibt den gesamten Text in "txt_zeitnachweis".

Wie wäre es mal probeweise damit, Dokumentation zu lesen?

von Peter II (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Das überschreibt den gesamten Text in "txt_zeitnachweis".
>
> Wie wäre es mal probeweise damit, Dokumentation zu lesen?

das stimmt zwar, aber der string c sollte immer länger werden. (ist ja 
eine schleife über die Zeilen der DB).

Ist also nur unsauber umgesetzt.

von SQElitär (Gast)


Lesenswert?

Hallo,

das Codebeispiel habe ich von dieser Seite:
https://www.codeproject.com/Articles/783073/A-Simple-Android-SQLite-Example

Genauso habe ich es ja in meinem Code umgesetzt (Stichwort "// Viewing 
all records").

Gruß

von SQElitär (Gast)


Lesenswert?

>Das überschreibt den gesamten Text in "txt_zeitnachweis".

"c" ist ein Cursor:
1
 Cursor c = db.rawQuery("SELECT * FROM Zeiterfassung", null);
2
                if (c.getCount() == 0) {
3
                    return;
4
                }
5
                StringBuffer buffer = new StringBuffer();
6
                while (c.moveToNext())
7
                {
8
...

von SQElitär (Gast)


Lesenswert?

Also ich habe jetzt noch zwei Probleme:
 - Die Zeitzone lässt sich nicht ändern bzw. die Uhrzeiten sind um eine 
Stunde zu früh
 - Die Datenbank-Entries werden nicht alle in der TextView angezeigt.


Wisst ihr, woran es liegen kann?

Danke schonmal und ein frohes Fest!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.