Bagaimana cara menyisipkan catatan SQLite dengan set waktu ke 'sekarang' di aplikasi Android?

109

Katakanlah, kami memiliki tabel yang dibuat sebagai:

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

Untuk memasukkan catatan, saya akan menggunakan

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

Tetapi bagaimana cara mengatur kolom date_created menjadi sekarang ? Untuk membuatnya jelas, file

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

Bukan solusi yang tepat. Ini hanya menyetel kolom ke teks "datetime ('now')".

droidguy
sumber
1
Satu masalah di sini adalah Android menggunakan SQLite untuk DB. Anda dapat mengatur kolom ke jenis tertentu tetapi itu hanya mengatur kolom 'afinitas'. SQLite akan memungkinkan Anda memasukkan nilai apa pun di kolom apa pun terlepas dari cara mendeklarasikannya. Untuk SQLite meletakkan string 'date' di mana saja cukup oke. sqlite.org memiliki penjelasan yang lebih lengkap. Saya voting jawaban e-satis di bawah ini, begitulah cara saya melakukannya (khususnya cara Jawa).
Akan

Jawaban:

194

Anda tidak dapat menggunakan fungsi datetime menggunakan "ContentValues" pembungkus Java. Anda dapat menggunakan:

  • SQLiteDatabase.execSQL sehingga Anda dapat memasukkan kueri SQL mentah.

    mDb.execSQL("INSERT INTO "+DATABASE_TABLE+" VALUES (null, datetime()) ");
  • Atau kemampuan waktu tanggal 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);
e-satis
sumber
1
Harap format ulang kode sebagai 'Contoh Kode'. Jika tidak, jawaban yang bagus.
Akan
3
apakah itu java.util.Date atau java.sql.Date?
Greg B
5
java.util.Date, tapi saya yakin Anda bisa melakukannya dengan tanggal java.sql.Date juga.
e-satis
44

Dalam kode saya, saya gunakan DATETIME DEFAULT CURRENT_TIMESTAMPsebagai jenis dan batasan kolom.

Dalam kasus Anda, definisi tabel Anda adalah

create table notes (
  _id integer primary key autoincrement, 
  created_date date default CURRENT_DATE
)
Gautier Hayoun
sumber
32

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

Metode 2

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

Metode 3 Menggunakan fungsi Java Date

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);
Rikin Patel
sumber
Penasaran, dapatkah Anda menunjukkan bagaimana Anda akan mengalihkan string yang dihasilkan kembali ke objek DATE?
erik
@erik Dapatkah Anda memberikan informasi lebih lanjut, saya tidak sepenuhnya mengerti apa yang Anda katakan.
Rikin Patel
jadi di atas Anda mengambil objek Tanggal dan mengubahnya menjadi string untuk ditempatkan di kolom sqlite .. tetapi ketika Anda menarik string itu dari database, bagaimana Anda mengubahnya kembali menjadi objek Tanggal?
erik
1
@erik SimpleDateFormat formatter = SimpleDateFormat baru ("yyyy-MM-hh HH: mm: dd"); formatter.parse (create_at);
Saksham
8

Ada beberapa opsi yang dapat Anda gunakan:

  1. Anda dapat mencoba menggunakan string "(DATETIME ('now'))" sebagai gantinya.
  2. Masukkan sendiri datetime, yaitu dengan System.currentTimeMillis ()
  3. Saat membuat tabel SQLite, tentukan nilai default untuk kolom create_date sebagai waktu tanggal saat ini.
  4. Gunakan SQLiteDatabase.execSQL untuk menyisipkan secara langsung.
segera
sumber
Nomor 1 tidak berfungsi (setidaknya tidak saat menggunakan ContentValuesdan update(), itu hanya menempatkan string DATETIME('now')di kolom.
Bart Friederichs
1
Yang kedua bermasalah dengan zona waktu. Saya memasukkan catatan dengan DEFAULT CURRENT_TIMESTAMPdan kemudian digunakan System.currentTimeMillis()untuk memperbarui. Saya melihat perbedaan satu jam.
Bart Friederichs
@sooniln Sudahkah Anda memverifikasi bahwa (DATETIME ('now')) memang akan memasukkan tanggal waktu saat ini?
IgorGanapolsky
Jika Anda ingin menambahkan tanggal waktu lokal, coba gunakan "datetime ('now', 'localtime')" sebagai gantinya
Simon
7

Bagi saya, masalahnya terlihat seperti Anda mengirim "datetime('now')"sebagai string, bukan nilai.

Pikiran saya adalah menemukan cara untuk mengambil tanggal / waktu saat ini dan mengirimkannya ke database Anda sebagai nilai tanggal / waktu, atau menemukan cara untuk menggunakan (DATETIME('NOW'))parameter built-in SQLite

Lihat jawaban di pertanyaan SO.com ini - mereka mungkin mengarahkan Anda ke arah yang benar.

Semoga ini membantu!

Jared Harley
sumber
5

Anda bisa menggunakan fungsi java yaitu:

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

Dengan cara ini, di db Anda, Anda menyimpan nomor.
Angka ini dapat diartikan sebagai berikut:

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

Alih-alih l ke dalam Tanggal baru (l), Anda harus memasukkan nomor tersebut ke dalam kolom tanggal.
Jadi, kamu sudah punya teman kencan.
Misalnya saya menyimpan di db saya nomor ini: 1332342462078
Tetapi ketika saya memanggil metode di atas saya mendapatkan hasil ini: 21-mar-2012 16.07.42

Marco Gallella
sumber
3

Berdasarkan jawaban @ e-satis saya membuat metode pribadi di kelas "DBTools" saya jadi menambahkan tanggal sekarang sangat mudah:

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

Gunakan sekarang seperti ini: values.put("lastUpdate", getNow());

Cedric Simon
sumber
1

Bekerja untuk saya dengan sempurna:

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

Simpan tanggal Anda sebagai lama.

Stefan Beike
sumber
0

Pastikan bidang tersebut tidak ditandai sebagai 'bukan nol' pada saat yang sama saat Anda mencoba memasukkan stempel waktu default menggunakan ekspresi "(DATETIME ('now'))"

AlokJoshiOfAarmax
sumber