จะแทรกระเบียน SQLite โดยตั้งวันที่และเวลาเป็น 'ตอนนี้' ในแอปพลิเคชัน Android ได้อย่างไร


109

สมมติว่าเรามีตารางที่สร้างขึ้นเป็น:

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

ในการแทรกบันทึกฉันจะใช้

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

แต่จะตั้งค่าคอลัมน์ date_created เป็นตอนนี้ได้อย่างไร? เพื่อให้ชัดเจน

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

ไม่ใช่ทางออกที่ถูกต้อง เพียงแค่ตั้งค่าคอลัมน์เป็นข้อความ "datetime ('now')"


1
ปัญหาหนึ่งที่นี่คือ Android ใช้ SQLite สำหรับ DB คุณสามารถตั้งค่าคอลัมน์เป็นประเภทใดประเภทหนึ่งได้ แต่เพียงแค่ตั้งค่าคอลัมน์ "ความสัมพันธ์" SQLite จะให้คุณใส่ค่าในคอลัมน์ใดก็ได้ไม่ว่าจะประกาศด้วยวิธีใดก็ตาม การที่ SQLite ใส่สตริง 'date' ไว้ที่ใดก็ได้ก็ค่อนข้างโอเค sqlite.org มีคำอธิบายอย่างละเอียดมากขึ้น ฉันกำลังโหวตคำตอบของ e-satis ด้านล่างนั่นคือวิธีที่ฉันทำ (โดยเฉพาะวิธี Java)
Will

คำตอบ:


194

คุณไม่สามารถใช้ฟังก์ชัน datetime โดยใช้ Java wrapper "ContentValues" คุณสามารถใช้:

  • SQLiteDatabase.execSQL เพื่อให้คุณสามารถป้อนแบบสอบถาม SQL ดิบ

    mDb.execSQL("INSERT INTO "+DATABASE_TABLE+" VALUES (null, datetime()) ");
  • หรือความสามารถของ java date time:

    // 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
กรุณาฟอร์แมตโค้ดใหม่เป็น 'Code Sample' เป็นอย่างอื่นคำตอบที่ดี
Will

3
นั่นคือ java.util.Date หรือ java.sql.Date?
Greg B

5
java.util.Date แต่ฉันแน่ใจว่าคุณสามารถทำได้กับ java.sql.Date date เช่นกัน
e-satis

44

ในรหัสของฉันฉันใช้DATETIME DEFAULT CURRENT_TIMESTAMPเป็นประเภทและข้อ จำกัด ของคอลัมน์

ในกรณีของคุณนิยามตารางของคุณจะเป็น

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

32

วิธีที่ 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
);

วิธีที่ 2

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

วิธีที่ 3 การใช้ฟังก์ชัน 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);

อยากรู้ไหมว่าคุณจะเปลี่ยนสตริงผลลัพธ์กลับไปเป็นวัตถุ DATE ได้อย่างไร
erik

@erik คุณให้ข้อมูลเพิ่มเติมได้ไหมฉันไม่เข้าใจอย่างที่คุณพูด
Rikin Patel

ข้างต้นคุณกำลังใช้วัตถุ Date และแปลงเป็นสตริงเพื่อวางในคอลัมน์ sqlite .. แต่เมื่อคุณดึงสตริงนั้นจากฐานข้อมูลคุณจะแปลงกลับเป็นวัตถุ Date ได้อย่างไร?
erik

1
ตัวจัดรูปแบบ @erik SimpleDateFormat = SimpleDateFormat ใหม่ ("yyyy-MM-dd HH: mm: ss"); formatter.parse (created_at);
Saksham

8

มีสองตัวเลือกที่คุณสามารถใช้ได้:

  1. คุณสามารถลองใช้สตริง "(DATETIME ('now'))" แทน
  2. แทรกวันที่และเวลาด้วยตัวคุณเองเช่น System.currentTimeMillis ()
  3. เมื่อสร้างตาราง SQLite ให้ระบุค่าเริ่มต้นสำหรับคอลัมน์ created_date เป็นเวลาวันที่ปัจจุบัน
  4. ใช้SQLiteDatabase.execSQLเพื่อแทรกโดยตรง

หมายเลข 1 ไม่ทำงาน (อย่างน้อยก็ไม่ใช่เมื่อใช้งานContentValuesและupdate()มันก็วางสตริงDATETIME('now')ไว้ในคอลัมน์
Bart Friederichs

1
เขตที่สองมีปัญหากับเขตเวลา ฉันแทรกบันทึกด้วยDEFAULT CURRENT_TIMESTAMPและใช้System.currentTimeMillis()ในการอัปเดตในภายหลัง ฉันเห็นความแตกต่างหนึ่งชั่วโมง
Bart Friederichs

@sooniln คุณตรวจสอบแล้วหรือยังว่า (DATETIME ('now')) จะแทรกวันที่และเวลาปัจจุบัน?
IgorGanapolsky

หากคุณต้องการเพิ่มวันที่และเวลาท้องถิ่นให้ลองใช้ "datetime ('now', 'localtime')" แทน
Simon

7

สำหรับฉันแล้วปัญหาดูเหมือนว่าคุณกำลังส่ง"datetime('now')"เป็นสตริงแทนที่จะเป็นค่า

ความคิดของฉันคือหาวิธีคว้าวันที่ / เวลาปัจจุบันและส่งไปยังฐานข้อมูลของคุณเป็นค่าวันที่ / เวลาหรือค้นหาวิธีใช้(DATETIME('NOW'))พารามิเตอร์ในตัวของ SQLite

ลองดู anwsers ที่คำถาม SO.com นี้พวกเขาอาจนำคุณไปในทิศทางที่ถูกต้อง

หวังว่านี่จะช่วยได้!


5

คุณสามารถใช้ฟังก์ชันของ java นั่นคือ:

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

ด้วยวิธีนี้ในฐานข้อมูลของคุณคุณจะบันทึกตัวเลข
ตัวเลขนี้สามารถตีความได้ด้วยวิธีนี้:

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

แทนที่จะเป็นวันที่ใหม่ (l) ให้คุณใส่ตัวเลขลงในคอลัมน์วันที่
ดังนั้นคุณมีวันที่ของคุณ
ตัวอย่างเช่นฉันบันทึกในฐานข้อมูลของฉันหมายเลขนี้: 1332342462078
แต่เมื่อฉันเรียกวิธีการด้านบนฉันได้ผลลัพธ์นี้: 21-mar-2012 16.07.42


3

จากคำตอบ @ e-satis ฉันได้สร้างเมธอดส่วนตัวในคลาส "DBTools" ของฉันดังนั้นการเพิ่มวันที่ปัจจุบันจึงทำได้ง่ายมาก:

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

ใช้ตอนนี้ดังนี้: values.put("lastUpdate", getNow());


1

เหมาะสำหรับฉันที่สมบูรณ์แบบ:

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

บันทึกวันที่ของคุณเป็นเวลานาน



0

ตรวจสอบให้แน่ใจว่าไม่ได้ทำเครื่องหมายฟิลด์เป็น 'not null' ในเวลาเดียวกับที่คุณพยายามแทรกการประทับเวลาเริ่มต้นโดยใช้นิพจน์ "(DATETIME ('now'))"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.