2013-05-24 20 views
22

Tôi có sqlite databaseLàm thế nào để thêm ngày trong cơ sở dữ liệu SQLite

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

tôi tạo ra nó db.execSQL(DB_PROCESS_CREATE);

Làm thế nào để gia tăng giá trị ngày trong cơ sở dữ liệu này? tôi đã cố gắng:

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

Nhưng sau đó tôi nhận được error:

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

Trả lời

39

Bây giờ khi bạn muốn chèn ngày vào cơ sở dữ liệu, bạn có thể sử dụng mã này.

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

Trong cơ sở dữ liệu chèn chuỗi 'date'

Định dạng ngày trong sqlite nên có định dạng sau:

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 

Để biết thêm chi tiết, có một cái nhìn: http://www.sqlite.org/lang_datefunc.html

+0

Tôi đã thử nó, nhưng trong trường hợp này không thể sắp xếp theo ngày –

+0

@KostyaKhuta Hãy thử điều này, điều này sẽ làm việc. Hãy để ngày PROCESS_DATE là ngày. – Homam

+0

Tôi sẽ thử ngay bây giờ –

2

Cách tốt nhất để đặt một ngày thành một cơ sở dữ liệu sẽ được sử dụng giá trị lâu dài của nó. Tôi đã cố gắng làm những gì bạn đang làm, và nó có một lỗi tương tự. Thay vì một chuỗi, đặt trong một giá trị số. Nó có thể mất giá trị dài, mà tôi tin là giá trị mili giây của một số loại. Sau đó nó có thể được hoàn nguyên khi bạn kéo nó ra.

+0

tôi nghĩ về nó, nhưng hơn tôi sẽ tìm thấy hồ sơ theo ngày, và nó sẽ là khó khăn nếu tôi lưu trữ ngày như giá trị lâu. –

+0

Bạn có thể kéo các giá trị và kiểm tra chúng sau đó, nhưng đó là một chút không hiệu quả.Bạn có thể tạo một bảng khác chỉ là một phần của ngày, như ngày, và tìm kiếm theo cách đó. Một vấn đề khác với mã của bạn có thể là bạn đang làm Date.valueOf() thay vì chỉ lưu trữ ngày tháng. Hãy thử thay vào đó. Valueof thực sự trả về kiểu dữ liệu ngày trong khi cơ sở dữ liệu của bạn muốn một chuỗi. –

+0

nó luôn luôn là tốt hơn để lưu trữ giá trị lâu dài trong DB khi lưu trữ một ngày trong một cơ sở dữ liệu như giá trị lâu dài luôn luôn là UTC. Điều này mang đến cho bạn cơ hội để luôn hiển thị ngày cho người dùng trong múi giờ hiện tại của họ. –

9

Bạn không thể lưu trữ ngày trong SQLite trực tiếp. Ví dụ, bạn có thể lưu nó như là giá trị số nguyên:

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

Trong trường hợp này trường ngày của bạn phải được khai báo là số nguyên:

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

Từ tài liệu SQLite: SQLite không có một bộ lớp lưu trữ sang một bên để lưu trữ ngày và/hoặc thời gian. Thay vào đó, được xây dựng trong ngày Và Time Chức năng của SQLite có khả năng lưu trữ ngày tháng và thời gian như TEXT, REAL, hoặc giá trị INTEGER:

  1. TEXT chuỗi như ISO8601 ("YYYY-MM-DD HH: MM : SS.SSS ").
  2. REAL là Julian số ngày, số ngày kể từ buổi trưa ở Greenwich vào ngày 24, 4714 trước Chúa. theo lịch Gregorian.
  3. INTEGER dưới dạng Thời gian Unix, số giây kể từ 1970-01-01 00:00:00 UTC. Ứng dụng có thể chọn lưu trữ ngày và giờ ở bất kỳ định dạng nào trong số các định dạng này và tự do chuyển đổi giữa các định dạng bằng cách sử dụng ngày tích hợp và chức năng thời gian.

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

+0

Đây phải là câu trả lời được chấp nhận. Xem: http://stackoverflow.com/a/13694823/3879470 –

Các vấn đề liên quan