将当前日期和时间保存在 Android 中

Save current date and time in Android

首先,我阅读了很多关于 Date 的文章 post,并了解了如何获取 Date 并对其进行自定义。但我的问题是每次按下按钮时我都需要当前日期。更清楚:

DateFormat date = new SimpleDateFormat("MMM dd yyyy, h:mm");
String dateFormat = date.format(Calendar.getInstance().getTime());

然后我调用我的模型 class 来设置日期 gramHelp.setDate(dateFormat); 这很好用,但是当我检查我的 SQL 数据库中的日期列表时,我只得到当前的日期和时间,而不是我保存日期的那一刻。同样的问题出现在我的另一个 activity 中,我正在调用 getDate() 列出数据库中的所有日期。

DateFormat datum = new SimpleDateFormat("MMM dd yyyy, h:mm");
String date = datum.format(Calendar.getInstance().getTime());
holder.date.setText(date)

代码基本相同,只是这次调用的是getTime()而不是setTime()

例如,这是日期列表:

在我写这篇文章的时候 post。你可以看到我有 5 个输入,但我每隔几分钟就输入一次。尽管如此,在 SQL 数据库和我的列表中,这是结果。

那么如何在我按下按钮时准确获取(保存)日期和时间?我想答案很简单,但还是没找到。

更新

首先 activity 我有 FAB,点击后将 date/time 保存在 SQL 数据库中。

 public void onClick(View v) {        
            DateFormat date = new SimpleDateFormat("MMM dd yyyy, h:mm");
            String dateFormat = date.format(Calendar.getInstance().getTime());
            GramHelp gramHelp = new GramHelp();              
            gramHelp.setDate(dateFormat);
            mDatabase.addGramTotal(gramHelp);
        }

GramHelp 是我的模型 class,其中我拥有所有构造函数以及 getter() 和 setter() 方法。我还从我的数据库中调用 addGramTotal() 函数。这是一个带有 ContentValues 的简单函数,用于在我的 SQL 数据库中插入值。

public void addGramTotal(GramHelp gramHelp){
    ContentValues values = new ContentValues();      
    values.put(FoodEntry.COLUMN_DATE, String.valueOf(gramHelp.getDate()));       
    SQLiteDatabase db = this.getWritableDatabase();
    db.update(FoodEntry.TABLE_NAME_HELPER, values, null, null);
}

要显示 SQL 数据库中的所有 dates/times,我正在使用 RecyclerView。在使用 RecyclerView 的 activity 中,我调用了一个名为 listHistory() 的函数。这个函数很简单SELECT * FROM table ORDER BY COLUMN_DATE。那部分应该没问题。

而且在我的 Adapter class for RecyclerView inside onBindViewHolder() 方法中我有:

public void onBindViewHolder(HistoryAdapter.HistoryViewHolder holder, final int position) {               
    DateFormat datum = new SimpleDateFormat("MMM dd yyyy, h:mm");
    String date = datum.format(Calendar.getInstance().getTime());
    holder.date.setText(date);     
}

第二次更新:

所以这是我的 table,其中 date/time 被保存。 如您所见,时间仅显示最新插入。 这是我数据库中的全部 SELECT 代码。你可以看到我在这个 table 中保存了更多的值。另外,我将日期设置为 String,因为出于某种原因我无法获得 Date(在 RecyclerView Adapter 方法 onBindViewHolder 中)。它适用于 String

但问题不应该出在检索 date/time 上。因为每次我将新值插入 table.

时 date/time 都会更改(更新)

这也是 library 我用来检查我的数据库的。

public List<GramHelp> listHistory(){
    String sql = "SELECT * FROM " +FoodEntry.TABLE_NAME_HELPER + " ORDER BY " +FoodEntry.COLUMN_DATE + " ASC ";
    SQLiteDatabase db = this.getReadableDatabase();
    List<GramHelp> listDate = new ArrayList<>();
    Cursor cursor = db.rawQuery(sql, null);
    if (cursor.moveToFirst()){
        do {
            int id = (cursor.getInt(0));
            int id_food = (cursor.getInt(1));
            int id_menu = (cursor.getInt(2));
            double gram = cursor.getDouble(3);
            double gram_total = cursor.getDouble(4);
            String date = new String(cursor.getString(5));
            listDate.add(new GramHelp(id, id_food, id_menu, gram, gram_total, date));
        } while (cursor.moveToNext());
    }
    cursor.close();
    return listDate;
}

如果我正确理解了你的问题,我希望你的代码看起来更像这样:

DateFormat date = new SimpleDateFormat("MMM dd yyyy, h:mm");
String dateFormatted = date.format(Calendar.getInstance().getTime());
gramHelp.setDate(dateFormatted);

阅读看起来像:

//DateFormat datum = new SimpleDateFormat("MMM dd yyyy, h:mm");
//String date = datum.format(gramHelp.getDate());
holder.date.setText(gramHelp.getDate())

其中 gramHelp 是一个模型。否则 Calendar.getInstance().getTime() 正在再次读取当前时间。

编辑:

现在你已经添加了额外的信息,我可以看到你正在呼叫 db.update 但没有 ID。这将导致没有行被更新(如果您读取 return 值,您应该看到 0)

你有两种方法:

  1. 如果你只应该在 table 中有 1 个项目(我无法想象是这种情况)或者如果插入发生得更早,那么当你执行insert 读取作为行 ID 的 return 值,在以后的更新中使用该 ID。

    • int id = db.insert
    • db.update(..., ..., "WHERE " + FoodEntry.ID + "=?", new String[] { String.valueOf(id) } )
  2. 如果它应该为每个项目创建一个新行,则将 db.update 替换为 db.insert

    • 如果您使用第二种方法,您需要确保在读回数据时,您通过 ID 或使用排序 FoodEntry.COLUMN_DATE + " asc"
    • 读取了正确的行

对于调试数据库的东西,我真的推荐 Facebook Stetho。用一行将它添加到您的项目中,您可以在计算机上从 Google Chrome 查看数据库的所有内容。 (所以你知道你的数据库中有什么并且可以解决数据是否错误(来自写入)或你的查询错误(用于读取)

Calendar calendar = Calendar.getInstance();
    int hour = calendar.get(Calendar.HOUR);
    int minute = calendar.get(Calendar.MINUTE);
    int date = calendar.get(Calendar.DATE);
    int month2 = calendar.get(Calendar.MONTH);
    int month = month2 + 1;
    int year = calendar.get(Calendar.YEAR);

以上代码很简单,可以获取当前日期和时间。