2013-05-24 12 views
22

mam sqlite databaseJak dodać datę w bazie danych sqlite

private static final String DB_PROCESS_CREATE = "create table " 
     + DB_TABLE_PROCESS + "(" + PROCESS_ID 
     + " integer primary key autoincrement, " 
     + PROCESS_DATE + " date);"; 

tworzę to db.execSQL(DB_PROCESS_CREATE);

Jak dodać wartość daty w tej bazie danych? Próbowałem:

String date = new SimpleDateFormat("yyyy.MM.dd").format(Calendar 
.getInstance().getTime()); 
ContentValues cv = new ContentValues(); 
cv.put(db.PROCESS_DATE,Date.valueOf(date)); 
db.mDB.insert(db.DB_TABLE_PROCESS, null, cv)); 

Ale potem dostać error:

"The method put(String, String) in the type ContentValues is not applicable for the arguments (String, Date)". 

Odpowiedz

39

Teraz, gdy chcesz wstawić datę do bazy danych, możesz użyć tego kodu.

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
String date = sdf.format(new Date()); 

W bazie wstawić ciąg 'data'

Format daty w SQLite powinien mieć następujący format:

YYYY-MM-DD 
YYYY-MM-DD HH:MM 
YYYY-MM-DD HH:MM:SS 
YYYY-MM-DD HH:MM:SS.SSS 
YYYY-MM-DDTHH:MM 
YYYY-MM-DDTHH:MM:SS 
YYYY-MM-DDTHH:MM:SS.SSS 
HH:MM 
HH:MM:SS 
HH:MM:SS.SSS 
now 
DDDDDDDDDD 

Aby uzyskać więcej szczegółów, zajrzyj: http://www.sqlite.org/lang_datefunc.html

+0

Próbowałem, ale w tym przypadku niemożliwe jest sortowanie według daty –

+0

@KostyaKhuta Spróbuj tego, to powinno działać. Niech typ PROCESS_DATE będzie datą. – Homam

+0

Spróbuję go teraz. –

2

Najlepszym sposobem, aby umieścić datę w bazie danych będzie za pomocą długiego wartość niego. Próbowałem zrobić to, co robiłeś, i miał podobny błąd. Zamiast łańcucha wstaw wartość liczbową. Może przyjąć długą wartość, która moim zdaniem jest wartością milisekundy. Po jej wyciągnięciu można go ponownie zmienić.

+0

myślę o nim, ale nie będę znalezionych rekordów według daty, a to będzie trudne, jeśli ja jak długi termin przechowywania wartości. –

+0

Można wyciągnąć wartości i sprawdzić je, ale to trochę nieefektywne.Możesz zrobić kolejną tabelę tylko jednej części daty, na przykład dnia, i przeszukać w ten sposób. Kolejny problem z kodem może polegać na tym, że robisz Date.valueOf() zamiast tylko zapisywania daty. Spróbuj zamiast tego. Valueof zwraca dane typu data, a baza danych żąda ciągu. –

+0

jest zawsze lepiej przechowywać długą wartość w DB podczas przechowywania daty w bazie danych, ponieważ długa wartość to zawsze UTC. Daje to szansę, aby zawsze wyświetlać datę użytkownikowi w ich aktualnej strefie czasowej. –

9

Nie można bezpośrednio zapisać daty w SQLite. Na przykład, można przechowywać je jako wartości całkowitej:

ContentValues cv = new ContentValues(); 
cv.put(db.PROCESS_DATE, new Date().getTime()); 
db.mDB.insert(db.DB_TABLE_PROCESS, null, cv)); 

W tym przypadku data pola muszą być zadeklarowane jako integer:

private static final String DB_PROCESS_CREATE = "create table " 
     + DB_TABLE_PROCESS + "(" + PROCESS_ID 
     + " integer primary key autoincrement, " 
     + PROCESS_DATE + " integer);"; 

Od SQLite docs: SQLite nie posiada zestaw Storage Class na bok do przechowywania dat i/lub czasów. Zamiast wbudowanej data i godzina Funkcje SQLite są zdolne do przechowywania daty i godziny jako tekst, prawdziwy, czy wartości:

  1. TEXT jak ISO8601 struny ("YYYY-MM-DD HH: MM : SS.SSS ").
  2. REAL jako Julian numery dni, liczba dni od południa w Greenwich w dniu 24, 4714 B.C. zgodnie z kalendarzem gregoriańskim.
  3. INTEGER jako Unix Czas, liczba sekund od 1970-01-01 00:00:00 UTC. Aplikacje mogą zapisywać daty i godziny w dowolnym z tych formatów i dowolnie konwertować między formatami za pomocą wbudowanej daty i funkcji czasowych .

Zobacz http://www.sqlite.org/datatype3.html

+0

To powinna być zaakceptowana odpowiedź. Zobacz: http://stackoverflow.com/a/13694823/3879470 –

Powiązane problemy