当我只关心日期(这是唯一的)而不是时间时,如何在Android sqLite数据库中管理日期?

ErE*_*rEm 5 sqlite android date

这是我的第一个问题,请耐心等待,如果不清楚我的意思,请告诉我.我不知道如何寻找答案.我对Android和Java都很陌生.

我想使用sqLite数据库表来存储值,我希望每天只有一个唯一的日期和"值"组合.想法是制作一种日志,每天只能记录一次(除了之后的更新或编辑).我决定使用Unix时间戳和INTEGER作为日期的数据类型.表看起来像这样:

("Unix_timestamp","value","state")
Run Code Online (Sandbox Code Playgroud)

现在我正在插入System.currentTimeMillis()/1000L但是那时每天可能有数千个日期具有相同的"价值",更不用说选择问题了.

插入和选择日期最方便的方法是什么?它应该通过sqLite函数还是某些Android或Java方法完成?

编辑:我几乎忘了补充:我有一个想法,在Unix时间插入日期,但他们是如此.总是一天的开始(午夜),但我无法弄清楚如何做到这一点,使用哪种方法.我觉得sqLite在日期方面非常糟糕.

Kar*_*uri 3

要在 SQLite 中获取当天开始的时间戳(以秒为单位),您可以使用 strftime 函数,如下所示:

strftime('%s','now','start of day')
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用 Calendar 在 java 中构建此值:

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
long time = calendar.getTimeInMillis();
Run Code Online (Sandbox Code Playgroud)

您可以在命令中使用唯一性约束CREATE TABLE来强制时间戳和值的每个组合在所有行中都是唯一的。

CREATE TABLE tableName (..., UNIQUE(column1, column2));
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以在同一语句中指定冲突算法来处理插入或更新违反此唯一性约束的情况。或者,您可以在尝试执行插入/更新时指定它:

SQLiteDatabase db = ...; // get database
long rowid = db.insertWithOnConflict(TABLE, null, values, SQLiteDatabase.CONFLICT_IGNORE);
Run Code Online (Sandbox Code Playgroud)

CONFLICT_IGNORE 不会引发异常,如果它创建了约束冲突,也不会写入新行。在这种情况下insertWithOnConflict()将返回-1,这样您就可以判断插入是否成功。