6

我使用此代码将字符串、日期、时间和 int 值插入到 sqlite 数据库中

void addRemAction(RemActions remaction) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(KEY_ACTOINS_TITLE, remaction.getTitle()); // Action title
    values.put(KEY_ACTIONS_MSG, remaction.getMsg()); // action msg



    values.put(KEY_ACTIONS_DATE, dateFormat.format(new Date()));  // action date
    values.put(KEY_ACTIONS_TIME, remaction.getTime()); // action time
    values.put(KEY_ACTIONS_PLACE_LONG, remaction.getPlong()); // action place long
    values.put(KEY_ACTIONS_PLACE_LAT, remaction.getPlat());  // action place lat

    // Inserting Row
    db.insert(TABLE_ACTIONS, null, values);
    db.close(); // Closing database connection

这是我检索它的代码

RemActions getRemAction(int id) {
    SQLiteDatabase db = this.getReadableDatabase();

    Cursor cursor = db.query(TABLE_ACTIONS, new String[] {KEY_ACTOINS_TITLE, KEY_ACTIONS_MSG, KEY_PLACES_NAME, KEY_ACTIONS_DATE, KEY_ACTIONS_TIME}, KEY_ACTIONS_ID + "=?",
            new String[] { String.valueOf(id) }, null, null, null, null);
    if (cursor != null)
        cursor.moveToFirst();

    RemActions remActions = new RemActions(cursor.getString(0),
            cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getInt(4));
    // return remActions
    return remActions;

现在我的 ide 给了我错误,因为 RemAction 类的构造函数中的第四个参数是 java.util.date 类中的 Date 类型。

我的问题是“如何设置光标以获取日期格式?”

我很高兴根据要求提供额外的代码

4

3 回答 3

12

由于您无法在 SQLite 中保存日期/时间值,因此您应该首先将它们转换为毫秒并将它们存储为毫秒。

Date c = new Date(System.currentTimeMillis());
long milliseconds = c.getTime();
//To get current time

如果您随后需要将毫秒更改回日期格式:

Date c = new Date(cursor.getLong(4));

然后您可以使用 格式化日期SimpleDateFormat

于 2013-07-30T11:38:25.757 回答
2

java.time

日期时间 API已java.util过时且容易出错。建议完全停止使用它并切换到现代 Date-Time API *

使用java.time现代日期时间 API 的解决方案:

  1. 用于Instant#now获取当前瞬间。
  2. 用于Instant#toEpochMilli将瞬间转换为 Unix 纪元 (1970-01-01T00:00:00Z) 的毫秒数。
  3. 用于从 Unix 纪元 (1970-01-01T00:00:00Z)Instant#ofEpochMilli获取使用毫秒的实例。Instant

演示:

import java.time.Instant;

public class Main {
    public static void main(String[] args) {
        Instant instant = Instant.now();
        System.out.println(instant);

        long instantToEpochMilli = instant.toEpochMilli();
        System.out.println(instantToEpochMilli);

        Instant instantOfEpochMilli = Instant.ofEpochMilli(instantToEpochMilli);
        System.out.println(instantOfEpochMilli);
    }
}

样本运行的输出:

2021-07-13T21:23:46.836723Z
1626211426836
2021-07-13T21:23:46.836Z

ONLINE DEMO

An代表UTCInstant时间线上的一个瞬时点。输出中的 是零时区偏移的时区指示符。它代表 Zulu 并指定时区(时区偏移量为小时)。ZEtc/UTC+00:00

从Trail: Date Time了解有关现代日期时间 API 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和 Android API 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

于 2021-07-13T21:28:39.373 回答
1

由于您将此值存储为Date#getTime(),因此您可以使用 恢复它new Date(cursor.getLong(4))

此外,您需要关闭Cursor您没有执行的操作。

于 2013-07-30T11:37:56.020 回答