如何在Android应用程序中插入日期时间设置为“现在”的SQLite记录?


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列设置为now?为了明确起见,

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

不是正确的解决方案。它只是将列设置为“ datetime('now')”文本。


1
这里的一个问题是Android将SQLite用于数据库。您可以将列设置为某种类型,但这只是将列设置为“亲和力”。SQLite允许您将任何值放在任何列中,而不管其如何声明。对于SQLite,将字符串“ date”放在任何地方都是可以的。sqlite.org有更详尽的解释。我在下面投票支持e-satis的答案,这就是我的做法(特别是Java方式)。
威尔

Answers:


194

您不能通过Java包装器“ ContentValues”使用datetime函数。您可以使用:

  • SQLiteDatabase.execSQL,因此您可以输入原始SQL查询。

    mDb.execSQL("INSERT INTO "+DATABASE_TABLE+" VALUES (null, datetime()) ");
  • 或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
请重新格式化代码为“代码示例”。否则,很好的答案。
威尔

3
是java.util.Date还是java.sql.Date?
格雷格·B

5
java.util.Date,但我确定您也可以使用java.sql.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
);

方法二

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 2015年

1
@erik SimpleDateFormat格式化程序= new SimpleDateFormat(“ yyyy-MM-dd HH:mm:ss”); formatter.parse(created_at);
萨克斯姆(Saksham)2016年

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()更新。我看到一个小时的差异。
巴特·弗里德里希斯

@sooniln您是否已验证(DATETIME('now'))确实会插入当前日期时间?
IgorGanapolsky

如果你想添加本地日期时间,尝试使用“日期时间(‘现在’,‘本地时间’)”,而不是
西蒙

7

对我来说,问题似乎是您"datetime('now')"以字符串而不是值的形式发送的。

我的想法是找到一种方法来获取当前日期/时间并将其作为日期/时间值发送到数据库,或者找到一种使用SQLite内置(DATETIME('NOW'))参数的方法。

这个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插入新的Date(l)中。
所以,你有约会。
例如,我在数据库中保存以下数字:1332342462078
但是,当我调用上述方法时,我得到以下结果:2012年3月21日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

在尝试使用表达式“(DATETIME('now'))”插入默认时间戳时,请确保该字段未同时标记为“ not null”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.