Jak wstawić rekord SQLite z datą ustawioną na „teraz” w aplikacji na Androida?


109

Powiedzmy, że mamy tabelę utworzoną jako:

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

Aby wstawić rekord, użyłbym

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

Ale jak ustawić kolumnę date_created na teraz ? Aby było jasne, plik

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

To nie jest właściwe rozwiązanie. Po prostu ustawia kolumnę na tekst „datetime ('now')”.


1
Jednym z problemów jest to, że Android używa SQLite dla bazy danych. Możesz ustawić kolumnę na określony typ, ale to tylko ustawi „powinowactwo” kolumn. SQLite pozwoli Ci umieścić dowolną wartość w dowolnej kolumnie, niezależnie od tego, jak została zadeklarowana. Umieszczenie w SQLite ciągu „data” w dowolnym miejscu jest całkiem w porządku. sqlite.org ma dokładniejsze wyjaśnienie. Głosuję na odpowiedź e-satis poniżej, tak to robię (szczególnie w Javie).
Will

Odpowiedzi:


194

Nie można używać funkcji daty i godziny za pomocą opakowania Java „ContentValues”. Możesz użyć:

  • SQLiteDatabase.execSQL, dzięki czemu można wprowadzić surowe zapytanie SQL.

    mDb.execSQL("INSERT INTO "+DATABASE_TABLE+" VALUES (null, datetime()) ");
  • Lub funkcje daty i godziny w języku Java:

    // 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);
    

1
Przeformatuj kod jako „Przykładowy kod”. W przeciwnym razie dobra odpowiedź.
Will

3
czy to java.util.Date czy java.sql.Date?
Greg B

5
java.util.Date, ale jestem pewien, że możesz to zrobić również z datą java.sql.Date.
e-satis

44

W moim kodzie używam DATETIME DEFAULT CURRENT_TIMESTAMPjako typu i ograniczenia kolumny.

W twoim przypadku twoja definicja tabeli byłaby

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

32

Metoda 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
);

Metoda 2

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

Metoda 3 Korzystanie z funkcji daty w języku Java

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);

Ciekawe, czy możesz pokazać, jak zamienić wynikowy ciąg z powrotem na obiekt DATE?
erik

@erik Czy możesz podać więcej informacji, nie rozumiem dokładnie tego, co powiedziałeś.
Rikin Patel

więc powyżej bierzesz obiekt Date i konwertujesz go na ciąg, który ma zostać umieszczony w kolumnie sqlite .. ale kiedy wyciągasz ten ciąg z bazy danych, jak przekonwertować go z powrotem na obiekt Date?
erik

1
@erik SimpleDateFormat formatter = nowy SimpleDateFormat ("rrrr-MM-dd HH: mm: ss"); formatter.parse (created_at);
Saksham

8

Istnieje kilka opcji, których możesz użyć:

  1. Możesz zamiast tego spróbować użyć ciągu „(DATETIME ('now'))”.
  2. Wprowadź datę i godzinę samodzielnie, np. Za pomocą System.currentTimeMillis ()
  3. Podczas tworzenia tabeli SQLite określ domyślną wartość kolumny created_date jako bieżącą datę i godzinę.
  4. Użyj SQLiteDatabase.execSQL, aby wstawić bezpośrednio.

Numer 1 nie działa (przynajmniej nie podczas używania ContentValuesi update()po prostu umieszcza ciąg DATETIME('now')w kolumnie.
Bart Friederichs

1
Drugi ma problemy ze strefami czasowymi. Wstawiłem rekord z DEFAULT CURRENT_TIMESTAMPa później użyłem System.currentTimeMillis()do aktualizacji. Widzę różnicę godzinową.
Bart Friederichs

@sooniln Czy sprawdziłeś, że (DATETIME ('now')) rzeczywiście wstawi bieżącą datę i godzinę?
IgorGanapolsky

Jeśli chcesz dodać lokalną datę i godzinę, spróbuj zamiast tego użyć „datetime ('now', 'localtime')”
Simon

7

Dla mnie problem wygląda na to, że wysyłasz "datetime('now')"jako ciąg znaków, a nie jako wartość.

Moim pomysłem jest znalezienie sposobu na pobranie bieżącej daty / godziny i wysłanie jej do bazy danych jako wartości daty / czasu lub znalezienie sposobu na użycie wbudowanego (DATETIME('NOW'))parametru SQLite

Sprawdź odpowiedzi na to pytanie SO.com - mogą one poprowadzić Cię we właściwym kierunku.

Mam nadzieję, że to pomoże!


5

Możesz skorzystać z funkcji java czyli:

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

W ten sposób w swojej bazie danych zapisujesz numer.
Liczbę tę można zinterpretować w następujący sposób:

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

Zamiast l do nowej daty (l), należy wstawić liczbę do kolumny daty.
Więc masz swoją randkę.
Na przykład zapisuję w mojej bazie danych ten numer: 1332342462078
Ale kiedy wywołuję powyższą metodę, otrzymuję następujący wynik: 21-mar-2012 16.07.42


3

Na podstawie odpowiedzi @ e-satis utworzyłem prywatną metodę na mojej klasie „DBTools”, więc dodanie aktualnej daty jest teraz naprawdę łatwe:

...
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);
        }
...

Użyj go teraz w ten sposób: values.put("lastUpdate", getNow());


1

U mnie działa idealnie:

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

Zachowaj datę jako długą.



0

Upewnij się, że pole nie jest oznaczone jako „nie jest puste” w tym samym czasie, gdy próbujesz wstawić domyślny znacznik czasu za pomocą wyrażenia „(DATETIME ('teraz'))”

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.