Forum: PC-Programmierung SQLite-Frage - Statement


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von SQElitär (Gast)


Bewertung
0 lesenswert
nicht 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:
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...
INSERT INTO Test VALUES  ...


Könnt ihr mir helfen? :-(


Vielen Dank!

von SQElitär (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
geht es um ein einfügen oder ein updaten?

von SQElitär (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
*Uhrzeit...

ich bin schon ganz durchgebrannt.

von Peter II (Gast)


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

von SQElitär (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Das Programm läuft gegen die Wand:
final SQLiteDatabase db = openOrCreateDatabase("StudentDB", Context.MODE_PRIVATE, null);
        db.execSQL("CREATE TABLE IF NOT EXISTS Zeiterfassung(Datum DATE, Kommen TIME, Gehen TIME, Arbeitszeit TIME);");

        //final TextView txt = (TextView) findViewById(R.id.textView1);
        // final EditText txt_kommen = (EditText) findViewById(R.id.txt_Kommen);
        //kommen.setText("Play");

        kommen.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
               // db.execSQL("INSERT INTO Zeiterfassung VALUES('DATE('now'),TIME('now')';");
                Toast.makeText(getApplicationContext(), "Kommen-Zeit wurde gebucht!", Toast.LENGTH_LONG).show();
            }
        });



        gehen.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                db.execSQL("UPDATE Zeiterfassung SET Gehen = TIME('now') WHERE Datum = DATE('now');");
                Toast.makeText(getApplicationContext(), "Gehen-Zeit wurde gebucht!", Toast.LENGTH_LONG).show();
            }
        });


von Clemens L. (c_l)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
>Konkreter bitte

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


von Jan H. (j_hansen)


Bewertung
0 lesenswert
nicht 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)


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

das stimmt dann das quoting nicht.

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

von Roland P. (pram)


Bewertung
0 lesenswert
nicht 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) (Moderator) Benutzerseite


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

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

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

von SQElitär (Gast)


Bewertung
0 lesenswert
nicht 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?
 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 
:-(
if (c.getCount() == 0) {
                    return;
                }
                StringBuffer buffer = new StringBuffer();
                while (c.moveToNext())
                {
                        buffer.append(c.getString(0) + "   ");
                        buffer.append(c.getString(1) + "   ");
                        buffer.append(c.getString(2) + "\n");
                        txt_zeitnachweis.setText(buffer.toString());
                }
}

Auch das verstehe ich nicht..
Danke!

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
2 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
>Das überschreibt den gesamten Text in "txt_zeitnachweis".

"c" ist ein Cursor:
 Cursor c = db.rawQuery("SELECT * FROM Zeiterfassung", null);
                if (c.getCount() == 0) {
                    return;
                }
                StringBuffer buffer = new StringBuffer();
                while (c.moveToNext())
                {
...

von SQElitär (Gast)


Bewertung
0 lesenswert
nicht 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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.