Làm cách nào để chèn bản ghi SQLite với ngày giờ được đặt thành 'bây giờ' trong ứng dụng Android?


109

Giả sử, chúng ta có một bảng được tạo dưới dạng:

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

Để chèn một bản ghi, tôi sẽ sử dụng

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

Nhưng làm cách nào để đặt cột date_create thành bây giờ ? Để làm rõ hơn,

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

Không phải là giải pháp đúng. Nó chỉ đặt cột thành văn bản "datetime ('now')".


1
Một vấn đề ở đây là Android sử dụng SQLite cho DB. Bạn có thể đặt cột thành một loại nhất định nhưng điều đó chỉ đặt 'mối quan hệ' của các cột. SQLite sẽ cho phép bạn đặt bất kỳ giá trị nào vào bất kỳ cột nào bất kể nó được khai báo như thế nào. Để SQLite đặt chuỗi 'date' ở bất kỳ đâu là khá ổn. sqlite.org có một lời giải thích kỹ lưỡng hơn. Tôi đang bỏ phiếu cho câu trả lời của e-thoả mãn bên dưới, đó là cách tôi làm điều đó (cụ thể là cách Java).
Sẽ

Câu trả lời:


194

Bạn không thể sử dụng hàm datetime bằng cách sử dụng trình bao bọc Java "ContentValues". Bạn có thể sử dụng:

  • SQLiteDatabase.execSQL để bạn có thể nhập một truy vấn SQL thô.

    mDb.execSQL("INSERT INTO "+DATABASE_TABLE+" VALUES (null, datetime()) ");
  • Hoặc các khả năng ngày giờ của 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
Vui lòng định dạng lại mã thành 'Mẫu mã'. Nếu không thì câu trả lời tốt.
Sẽ

3
đó là java.util.Date hay java.sql.Date?
Greg B

5
java.util.Date, nhưng tôi chắc rằng bạn cũng có thể làm được với java.sql.Date date.
e-thoả mãn

44

Trong mã của tôi, tôi sử dụng DATETIME DEFAULT CURRENT_TIMESTAMPlàm kiểu và ràng buộc của cột.

Trong trường hợp của bạn, định nghĩa bảng của bạn sẽ là

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

32

Phương pháp 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
);

Phương pháp 2

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

Phương pháp 3 Sử dụng các hàm Ngày của 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);

Tò mò, bạn có thể cho biết cách bạn sẽ chuyển chuỗi kết quả trở lại đối tượng DATE không?
erik

@erik Bạn có thể cung cấp thêm thông tin, tôi không hiểu chính xác những gì bạn nói.
Rikin Patel,

vì vậy ở trên bạn đang lấy một đối tượng Date và chuyển đổi nó thành một chuỗi để đặt trong một cột sqlite .. nhưng khi bạn kéo chuỗi đó từ cơ sở dữ liệu, làm thế nào để bạn chuyển đổi nó trở lại đối tượng Date?
erik

1
@erik SimpleDateFormat định dạng = new SimpleDateFormat ("yyyy-MM-dd HH: mm: ss"); formatter.parse (create_at);
Saksham

8

Có một số tùy chọn bạn có thể sử dụng:

  1. Thay vào đó, bạn có thể thử sử dụng chuỗi "(DATETIME ('now'))".
  2. Tự chèn ngày giờ, tức là với System.currentTimeMillis ()
  3. Khi tạo bảng SQLite, hãy chỉ định một giá trị mặc định cho cột create_date là ngày hiện tại.
  4. Sử dụng SQLiteDatabase.execSQL để chèn trực tiếp.

Số 1 không hoạt động (ít nhất là không khi sử dụng ContentValuesupdate(), nó chỉ đặt chuỗi DATETIME('now')vào cột.
Bart Friederichs

1
Cái thứ hai có vấn đề với múi giờ. Tôi đã chèn một bản ghi với một DEFAULT CURRENT_TIMESTAMPvà sau đó được sử dụng System.currentTimeMillis()để cập nhật. Tôi thấy một giờ khác biệt.
Bart Friederichs

@sooniln Bạn đã xác minh rằng (DATETIME ('now')) sẽ thực sự chèn ngày giờ hiện tại chưa?
IgorGanapolsky

Nếu bạn muốn thêm ngày giờ địa phương, hãy thử sử dụng "datetime ('now', 'localtime')" để thay thế
Simon

7

Đối với tôi, vấn đề có vẻ như bạn đang gửi "datetime('now')"dưới dạng một chuỗi, thay vì một giá trị.

Suy nghĩ của tôi là tìm cách lấy ngày / giờ hiện tại và gửi nó đến cơ sở dữ liệu của bạn dưới dạng giá trị ngày / giờ hoặc tìm cách sử dụng (DATETIME('NOW'))tham số tích hợp sẵn của SQLite

Kiểm tra các nhà khảo sát tại câu hỏi SO.com này - họ có thể dẫn bạn đi đúng hướng.

Hy vọng rằng điều này sẽ giúp!


5

Bạn có thể sử dụng chức năng của java đó là:

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

Bằng cách này, trong db của bạn, bạn lưu một số.
Con số này có thể được hiểu theo cách này:

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

Thay vì l vào Ngày (l) mới, bạn chèn số vào cột ngày.
Vì vậy, bạn có ngày của bạn.
Ví dụ, tôi lưu trong db của mình số này: 1332342462078
Nhưng khi tôi gọi phương thức trên, tôi có kết quả này: 21-mar-2012 16.07.42


3

Dựa trên câu trả lời @ e-thoả mãn, tôi đã tạo một phương thức riêng tư trên lớp "DBTools" của mình để thêm ngày hiện tại giờ thực sự dễ dàng:

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

Sử dụng nó ngay bây giờ như thế này: values.put("lastUpdate", getNow());


1

Hoạt động hoàn hảo cho tôi:

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

Lưu ngày của bạn càng lâu.



0

Đảm bảo rằng trường không được đánh dấu là 'không rỗng' đồng thời khi bạn đang cố chèn dấu thời gian mặc định bằng cách sử dụng biểu thức "(DATETIME ('now'))"

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.