Wie füge ich einen SQLite-Datensatz ein, dessen Datum / Uhrzeit in der Android-Anwendung auf "Jetzt" gesetzt ist?

109

Angenommen, wir haben eine Tabelle erstellt als:

create table notes (_id integer primary key autoincrement, created_date date)

Um einen Datensatz einzufügen, würde ich verwenden

ContentValues initialValues = new ContentValues(); 
initialValues.put("date_created", "");
long rowId = mDb.insert(DATABASE_TABLE, null, initialValues);

Aber wie setzt man die Spalte date_created auf jetzt ? Um es klar zu machen, die

initialValues.put("date_created", "datetime('now')");

Ist nicht die richtige Lösung. Die Spalte wird lediglich auf "datetime ('now')" - Text gesetzt.

Droidguy
quelle
1
Ein Problem hierbei ist, dass Android SQLite für die Datenbank verwendet. Sie können eine Spalte auf einen bestimmten Typ festlegen, dies legt jedoch nur die 'Affinität' der Spalten fest. Mit SQLite können Sie einen beliebigen Wert in eine beliebige Spalte einfügen, unabhängig davon, wie er deklariert ist. Für SQLite ist es ziemlich in Ordnung, die Zeichenfolge 'Datum' an einer beliebigen Stelle einzufügen. sqlite.org hat eine gründlichere Erklärung. Ich stimme die Antwort von e-satis unten ab, so mache ich das (speziell auf Java-Art).
Will

Antworten:

194

Sie können die datetime-Funktion nicht mit dem Java-Wrapper "ContentValues" verwenden. Entweder können Sie verwenden:

  • SQLiteDatabase.execSQL, damit Sie eine unformatierte SQL-Abfrage eingeben können.

    mDb.execSQL("INSERT INTO "+DATABASE_TABLE+" VALUES (null, datetime()) ");
  • Oder die Java-Datums- und Uhrzeitfunktionen:

    // set the format to sql date time
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    Date date = new Date();
    ContentValues initialValues = new ContentValues(); 
    initialValues.put("date_created", dateFormat.format(date));
    long rowId = mDb.insert(DATABASE_TABLE, null, initialValues);
e-satis
quelle
1
Bitte formatieren Sie den Code als "Codebeispiel" neu. Ansonsten gute Antwort.
Wird
3
ist das ein java.util.Date oder ein java.sql.Date?
Greg B
5
java.util.Date, aber ich bin sicher, dass Sie dies auch mit java.sql.Date tun können.
E-Satis
44

In meinem Code verwende ich DATETIME DEFAULT CURRENT_TIMESTAMPals Typ und Einschränkung der Spalte.

In Ihrem Fall wäre Ihre Tabellendefinition

create table notes (
  _id integer primary key autoincrement, 
  created_date date default CURRENT_DATE
)
Gautier Hayoun
quelle
32

Methode 1

CURRENT_TIME  Inserts only time
CURRENT_DATE  Inserts only date
CURRENT_TIMESTAMP  Inserts both time and date

CREATE TABLE users(
    id INTEGER PRIMARY KEY,
    username TEXT,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

Methode 2

db.execSQL("INSERT INTO users(username, created_at) 
            VALUES('ravitamada', 'datetime()'");

Methode 3 Verwenden von Java-Datumsfunktionen

private String getDateTime() {
        SimpleDateFormat dateFormat = new SimpleDateFormat(
                "yyyy-MM-dd HH:mm:ss", Locale.getDefault());
        Date date = new Date();
        return dateFormat.format(date);
}

ContentValues values = new ContentValues();
values.put('username', 'ravitamada');
values.put('created_at', getDateTime());
// insert the row
long id = db.insert('users', null, values);
Rikin Patel
quelle
Können Sie neugierig zeigen, wie Sie die resultierende Zeichenfolge wieder in ein DATE-Objekt umwandeln würden?
Erik
@erik Kannst du mehr Informationen geben, ich verstehe nicht genau, was du gesagt hast.
Rikin Patel
Wenn Sie also oben ein Date-Objekt nehmen und es in eine Zeichenfolge konvertieren, die in eine SQLite-Spalte eingefügt werden soll. Wie konvertieren Sie diese Zeichenfolge aus der Datenbank zurück in ein Date-Objekt?
Erik
1
@erik SimpleDateFormat formatter = neues SimpleDateFormat ("JJJJ-MM-TT HH: MM: SS"); formatter.parse (created_at);
Saksham
8

Es gibt einige Optionen, die Sie verwenden können:

  1. Sie können stattdessen versuchen, die Zeichenfolge "(DATETIME ('now'))" zu verwenden.
  2. Fügen Sie die Datumszeit selbst ein, dh mit System.currentTimeMillis ()
  3. Geben Sie beim Erstellen der SQLite-Tabelle einen Standardwert für die Spalte created_date als aktuelle Datums- und Uhrzeitangabe an.
  4. Verwenden Sie SQLiteDatabase.execSQL , um direkt einzufügen.
bald
quelle
Nummer 1 funktioniert nicht (zumindest nicht bei Verwendung von ContentValuesund update(), es setzt nur die Zeichenfolge DATETIME('now')in die Spalte.
Bart Friederichs
1
Der zweite hat Probleme mit Zeitzonen. Ich habe einen Datensatz mit einem eingefügt DEFAULT CURRENT_TIMESTAMPund später System.currentTimeMillis()zum Aktualisieren verwendet. Ich sehe einen Stundenunterschied.
Bart Friederichs
@sooniln Haben Sie überprüft, dass (DATETIME ('now')) tatsächlich die aktuelle datetime einfügt?
IgorGanapolsky
Wenn Sie lokale Datums- und Uhrzeitangaben hinzufügen möchten, versuchen Sie stattdessen, "Datumszeit ('jetzt', 'Ortszeit')" zu verwenden
Simon
7

Für mich sieht das Problem so aus, "datetime('now')"als würden Sie als Zeichenfolge und nicht als Wert senden .

Mein Gedanke ist, eine Möglichkeit zu finden, das aktuelle Datum / die aktuelle Uhrzeit zu erfassen und als Datums- / Uhrzeitwert an Ihre Datenbank zu senden, oder eine Möglichkeit zu finden, den integrierten (DATETIME('NOW'))Parameter von SQLite zu verwenden

Schauen Sie sich die Antworten auf diese SO.com-Frage an - sie könnten Sie in die richtige Richtung führen.

Hoffentlich hilft das!

Jared Harley
quelle
5

Sie können die Funktion von Java verwenden:

ContentValues cv = new ContentValues();
cv.put(Constants.DATE, java.lang.System.currentTimeMillis());  

Auf diese Weise speichern Sie in Ihrer Datenbank eine Nummer.
Diese Nummer könnte folgendermaßen interpretiert werden:

    DateFormat dateF = DateFormat.getDateTimeInstance();
    String data = dateF.format(new Date(l));

Anstelle von l in neues Datum (l) sollten Sie die Nummer in die Datumsspalte einfügen.
Also hast du dein Date.
Zum Beispiel speichere ich in meiner Datenbank diese Nummer: 1332342462078
Aber wenn ich die obige Methode aufrufe, habe ich dieses Ergebnis: 21-mar-2012 16.07.42

Marco Gallella
quelle
3

Basierend auf der Antwort von @ e-satis habe ich eine private Methode für meine "DBTools" -Klasse erstellt, sodass das Hinzufügen des aktuellen Datums jetzt ganz einfach ist:

...
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
...
        private String getNow(){
            // set the format to sql date time
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = new Date();
            return dateFormat.format(date);
        }
...

Verwenden Sie es jetzt so: values.put("lastUpdate", getNow());

Cedric Simon
quelle
1

Funktioniert bei mir perfekt:

    values.put(DBHelper.COLUMN_RECEIVEDATE, geo.getReceiveDate().getTime());

Speichern Sie Ihr Datum als lange.

Stefan Beike
quelle
0

Stellen Sie sicher, dass das Feld nicht gleichzeitig mit dem Ausdruck "(DATETIME ('now'))" als "nicht null" markiert ist, wenn Sie versuchen, einen Standardzeitstempel einzufügen.

AlokJoshiOfAarmax
quelle