Android uygulamasında datetime 'now' olarak ayarlanmış bir SQLite kaydı nasıl eklenir?


109

Diyelim ki şu şekilde oluşturulmuş bir tablomuz var:

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

Bir kayıt eklemek için kullanırım

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

Ancak date_created sütunu şimdiye nasıl ayarlanır ? Netleştirmek için,

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

Doğru çözüm değil. Yalnızca sütunu "tarih saat ('şimdi')" metnine ayarlar.


1
Buradaki bir sorun, Android'in DB için SQLite kullanmasıdır. Bir sütunu belirli bir türe ayarlayabilirsiniz, ancak bu yalnızca 'yakınlığı' ayarlar. SQLite, nasıl beyan edildiğine bakılmaksızın herhangi bir sütuna herhangi bir değer koymanıza izin verecektir. SQLite için herhangi bir yere 'tarih' dizesini koymak oldukça iyidir. sqlite.org'un daha kapsamlı bir açıklaması var. Aşağıda e-satis'in cevabını oyluyorum, işte böyle yapıyorum (özellikle Java yöntemi).
Will

Yanıtlar:


194

Java sarmalayıcısı "ContentValues" kullanarak datetime işlevini kullanamazsınız. Ya kullanabilirsiniz:

  • SQLiteDatabase.execSQL, böylece ham bir SQL sorgusu girebilirsiniz.

    mDb.execSQL("INSERT INTO "+DATABASE_TABLE+" VALUES (null, datetime()) ");
  • Veya java tarih ve saat yetenekleri:

    // 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
Lütfen kodu 'Kod Örneği' olarak yeniden biçimlendirin. Aksi takdirde iyi cevap.
Will

3
bu bir java.util.Date mi yoksa java.sql.Date mi?
Greg B

5
java.util.Date, ancak eminim bunu java.sql.Date tarihi ile de yapabilirsiniz.
e-satis

44

DATETIME DEFAULT CURRENT_TIMESTAMPKodumda sütunun türü ve kısıtlaması olarak kullanıyorum .

Sizin durumunuzda tablo tanımınız şöyle olacaktır:

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

32

Yöntem 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
);

Yöntem 2

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

Yöntem 3 Java Tarih işlevlerini kullanma

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

Merak ediyorum, ortaya çıkan dizgiyi DATE nesnesine nasıl geri döndüreceğinizi gösterebilir misiniz?
erik

@erik Biraz daha bilgi verebilir misin, dediğini tam olarak anlamıyorum.
Rikin Patel

bu yüzden yukarıda bir Date nesnesini alıp bir sqlite sütununa yerleştirilecek bir dizgeye dönüştürüyorsunuz .. ama bu dizeyi veritabanından çektiğinizde, onu nasıl bir Date nesnesine dönüştürürsünüz?
erik

1
@erik SimpleDateFormat formatter = new SimpleDateFormat ("yyyy-MM-gg SS: mm: ss"); (created_at) formatter.parse;
Saksham

8

Kullanabileceğiniz birkaç seçenek vardır:

  1. Bunun yerine "(DATETIME ('şimdi'))" dizesini kullanmayı deneyebilirsiniz.
  2. Tarih saatini kendiniz ekleyin, yani System.currentTimeMillis () ile
  3. SQLite tablosunu oluştururken, create_date sütunu için geçerli tarih saati olarak varsayılan bir değer belirtin.
  4. Doğrudan eklemek için SQLiteDatabase.execSQL kullanın .

1 numara kullanırken en az değil (değil çalışır ContentValuesve update()sadece dize koyar DATETIME('now')sütunda.
Bart Friederichs

1
İkincisi saat dilimleriyle ilgili sorunlar yaşıyor. A DEFAULT CURRENT_TIMESTAMPve daha sonra System.currentTimeMillis()güncellemek için kullanılan bir kayıt ekledim. Bir saat farkı görüyorum.
Bart Friederichs

@sooniln (DATETIME ('şimdi')) gerçekten geçerli tarih saatini ekleyeceğini doğruladınız mı?
IgorGanapolsky

Yerel tarih saat eklemek istiyorsanız bunun yerine "tarih saat ('şimdi', 'yerel zaman')" kullanmayı deneyin
Simon

7

Bana göre sorun "datetime('now')", bir değerden ziyade bir dizge olarak gönderiyormuşsunuz gibi görünüyor .

Benim düşüncem, geçerli tarihi / saati almanın ve bunu veritabanınıza tarih / saat değeri olarak göndermenin veya SQLite'nin yerleşik (DATETIME('NOW'))parametresini kullanmanın bir yolunu bulmanın bir yolunu bulmak.

Bu SO.com sorusundaki cevaplara göz atın - sizi doğru yöne yönlendirebilirler.

Umarım bu yardımcı olur!


5

Java'nın şu işlevini kullanabilirsiniz:

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

Bu şekilde db'nize bir numara kaydedersiniz.
Bu sayı şu şekilde yorumlanabilir:

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

Yeni Tarihe (l) l yerine, sayıyı tarih sütununa eklemelisiniz.
Demek randevun var.
Örneğin db'ime şu numarayı kaydediyorum: 1332342462078
Ama yukarıdaki yöntemi aradığımda şu sonucu elde ediyorum: 21-mar-2012 16.07.42


3

@ E-satis cevabına dayanarak, "DBTools" sınıfımda özel bir yöntem oluşturdum, bu nedenle şu anki tarihi eklemek gerçekten çok kolay:

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

Şimdi şu şekilde kullanın: values.put("lastUpdate", getNow());


1

Benim için mükemmel çalışıyor:

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

Tarihinizi uzun olarak kaydedin.



0

"(DATETIME (" şimdi "))" ifadesini kullanarak varsayılan bir zaman damgası eklemeye çalışırken, alanın "boş değil" olarak işaretlenmediğinden emin olun.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.