如何在Android下的SQLite中正确插入日期时间值?

时间:2012-05-25 16:58:46

标签: android sqlite

我正在开发一个虚拟的android项目来获取一些东西。以下代码行中断我的Android应用程序没有任何错误。我使用Idea作为IDE。

database.execSQL("Insert Into todos(uid, name, created_on, changed_on) values('6a7047ed-c2f9-407f-a774-1c02b0fe9caf', 'todo', DATETIME('NOW'), DATETIME('NOW'))");

我确定数据库有给定的列,如果我只使用:

database.execSQL("Insert Into todos(uid, name) values('6a7047ed-c2f9-407f-a774-1c02b0fe9caf', 'todo')");

应用程序按照应有的方式工作。

我尝试插入这样的日期(based on answered question related to this matter):

 '2012-05-25 16:52:00'

 date('now')

我遇到同样的崩溃,没有错误或调试日志。

我在这里缺少什么?

更新

根据要求,用于创建数据库表的代码。

    public static final String TABLE_TODOS = "todos";
    public static final String COLUMN_ID = "id";
    public static final String COLUMN_UID = "uid";
    public static final String COLUMN_NAME = "name";
    public static final String COLUMN_CHECKED = "checked";
    public static final String COLUMN_TO_DELETE = "must_delete";
    public static final String COLUMN_CHANGED_ON = "changed_on";

    public static final String COLUMN_CREATED = "created_on";

    private static final String DATABASE_CREATE = "create table "
            + TABLE_TODOS + "( "
            + COLUMN_ID + " integer primary key autoincrement, "
            + COLUMN_UID + " varchar(50), "
            + COLUMN_NAME + " text not null, "
            + COLUMN_CHECKED + " integer default 0, "
            + COLUMN_TO_DELETE + " integer default 0, "
            + COLUMN_CHANGED_ON + " datetime "
            + COLUMN_CREATED + " datetime "
            +");";

3 个答案:

答案 0 :(得分:4)

您的问题是您声明了SQlite中不存在的数据类型。来自文档:

“1。1日期和时间数据类型

SQLite没有预留用于存储日期和/或时间的存储类。相反,SQLite的内置日期和时间函数能够将日期和时间存储为TEXT,REAL或INTEGER值:

TEXT as ISO8601 strings(“YYYY-MM-DD HH:MM:SS.SSS”)。真实的朱利安日数,是公元前4714年11月24日格林威治中午以来的天数。根据公历格里高利历。 INTEGER as Unix Time,自1970-01-01 00:00:00 UTC以来的秒数。

应用程序可以选择以任何格式存储日期和时间,并使用内置的日期和时间函数在格式之间自由转换。“

因此,更改数据库中的数据类型,重新创建它,并更改您的方法以插入/更新/检索这些列中的数据以匹配正确的数据类型,事情应该更适合您。

答案 1 :(得分:3)

您在表create statement中的created_on列之前缺少逗号。

+ COLUMN_CHANGED_ON + " datetime "

应该是

+ COLUMN_CHANGED_ON + " datetime, "

答案 2 :(得分:2)

根据他们自己的文档SQLite,将使用正确的数据类型NUMERIC来记录DATETIME http://www.sqlite.org/datatype3.html遵循亲和力数据类型的规则。请参阅Affinity表。

COLUMN_CHANGED_ON + " datetime "

应该是

COLUMN_CHANGED_ON + " NUMERIC, "

使用正确的亲和关系数据类型,您可以比较值,例如

SELECT b < '40', b < '60', b < '600' FROM t1;