2015-08-25 11 views
5

Đây là câu hỏi đầu tiên của tôi nên tôi phải chịu đựng và chỉ cho tôi biết nếu nó không rõ ràng ý tôi là gì. Tôi không biết phải tìm câu trả lời như thế nào. Tôi khá mới đối với cả Android và Java.Làm cách nào để quản lý các ngày trong cơ sở dữ liệu sqlite của Android khi tôi chỉ quan tâm đến ngày (đó là duy nhất) chứ không phải thời gian?

Tôi muốn sử dụng bảng cơ sở dữ liệu sqLite để lưu trữ các giá trị và tôi muốn chỉ có một, ngày duy nhất và kết hợp "giá trị" mỗi ngày. Ý tưởng là tạo một loại nhật ký, nơi mọi thứ chỉ có thể được ghi lại một lần mỗi ngày (ngoại trừ việc cập nhật hoặc chỉnh sửa sau đó). Tôi đã quyết định sử dụng dấu thời gian Unix và INTEGER làm kiểu dữ liệu cho ngày tháng. Bảng trông giống như sau:

("Unix_timestamp","value","state") 

Ngay bây giờ tôi đang chèn System.currentTimeMillis()/1000L nhưng sau đó có thể có hàng ngàn ngày mỗi một ngày với "giá trị" cùng chưa kể đến vấn đề với lựa chọn.

Cách chèn và chọn ngày thuận tiện nhất là gì? Nó có nên được thực hiện thông qua các hàm sqlite hoặc một số phương thức Android hay java không?

EDIT: Tôi gần như quên thêm: Tôi có ý tưởng chèn ngày trong thời gian Unix nhưng theo cách chúng là ví dụ. luôn luôn là khởi đầu của ngày (nửa đêm) nhưng tôi không thể tìm ra cách để làm điều này, mà phương pháp để sử dụng. Tôi cảm thấy như sqLite thực sự là xấu khi nói đến ngày tháng.

+0

Ý của bạn là gì khi kết hợp 'ngày và giá trị duy nhất 'cho mỗi ngày'? –

+0

Tôi có nghĩa là chỉ nên có một nhật ký mỗi ngày, ví dụ nếu tôi muốn sử dụng thời gian unix thì phải như thế này '(now, value_x)' - điều này sẽ được chèn vào, sau đó giả sử tôi thử chèn '(bây giờ +1, value_x) '- điều này KHÔNG nên được chèn vì nó vẫn là cùng ngày và" giá trị "cũng giống nhau. –

+0

Vì vậy, bạn muốn đặt tuple của '(thời gian, giá trị)' vào cột sqlite? –

Trả lời

3

Để có được một dấu thời gian cho sự bắt đầu của ngày hiện tại (tính bằng giây) trong SQLite bạn có thể sử dụng chức năng strftime như vậy:

strftime('%s','now','start of day') 

Ngoài ra, bạn có thể xây dựng giá trị này trong java bằng Lịch:

Calendar calendar = Calendar.getInstance(); 
calendar.set(Calendar.HOUR_OF_DAY, 0); 
calendar.set(Calendar.MINUTE, 0); 
calendar.set(Calendar.SECOND, 0); 
calendar.set(Calendar.MILLISECOND, 0); 
long time = calendar.getTimeInMillis(); 

Bạn có thể sử dụng ràng buộc duy nhất trong lệnh CREATE TABLE để thực thi mỗi kết hợp dấu thời gian và giá trị là duy nhất trên tất cả các hàng.

CREATE TABLE tableName (..., UNIQUE(column1, column2)); 

Nếu muốn, trong cùng một tuyên bố, bạn có thể chỉ định thuật toán xung đột sẽ vi phạm ràng buộc duy nhất này. Ngoài ra, bạn có thể xác định nó khi bạn cố gắng làm các việc chèn/cập nhật:

SQLiteDatabase db = ...; // get database 
long rowid = db.insertWithOnConflict(TABLE, null, values, SQLiteDatabase.CONFLICT_IGNORE); 

CONFLICT_IGNORE sẽ không tăng ngoại lệ và sẽ không viết một dòng mới nếu nó tạo ra một sự vi phạm hạn chế. Trong trường hợp đó insertWithOnConflict() sẽ trả về -1, do đó bạn có thể biết liệu chèn có thành công hay không.

+0

Nó làm việc :) Tôi chỉ có một vấn đề với việc chọn ngày, phương pháp của tôi luôn luôn trả về null. –

+0

Nó hoạt động :) Tôi chỉ có một vấn đề với việc chọn ngày. Phương thức của tôi luôn trả về giá trị rỗng. Tôi vượt qua đối số unixtimestamp giống như trong chèn (thông qua đối tượng Lịch) arguments- unixtimestamp dài, String habittitle Query là ' "SELECT ... Ở ĐÂU ngày == unixtimestamp VÀ thói quen NHƯ habittitle"' 'Cursor con trỏ = database.rawQuery (truy vấn, null); // lặp qua tất cả các hàng và chọn if (cursor.moveToFirst()) {// đang nhận dữ liệu cho đối tượng // returns tìm thấy hàng như một đối tượng trở calendarRow; } return null; ' –

+0

Nevermind, tôi nghĩ rằng tôi đã nhận nó làm việc :) Cảm ơn bạn! –

2

Nếu tôi không sai, bạn muốn lưu dữ liệu trong múi giờ UTC để có thể chuyển đổi dễ dàng trong bất kỳ múi giờ nào.

Trường hợp 1: Đối với datetime

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US); 
format.setTimeZone(TimeZone.getTimeZone("UTC")); 

Date date = format.parse(dateText); 
long millis = date.getTime(); 
//your code - save datetime in milliseconds in SQLite numeric field 

Trường hợp 2: cho ngày chỉ

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); 

Date date = format.parse(dateText); 
long millis = date.getTime(); 
//your code - save datetime in milliseconds in SQLite numeric field 

Bạn có thể tạo chế duy nhất trên cột ngày để giữ giá trị duy nhất.

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