将当前日期和时间保存在 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)
你有两种方法:
如果你只应该在 table 中有 1 个项目(我无法想象是这种情况)或者如果插入发生得更早,那么当你执行insert
读取作为行 ID 的 return 值,在以后的更新中使用该 ID。
int id = db.insert
db.update(..., ..., "WHERE " + FoodEntry.ID + "=?", new String[] { String.valueOf(id) } )
如果它应该为每个项目创建一个新行,则将 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);
以上代码很简单,可以获取当前日期和时间。
首先,我阅读了很多关于 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)
你有两种方法:
如果你只应该在 table 中有 1 个项目(我无法想象是这种情况)或者如果插入发生得更早,那么当你执行
insert
读取作为行 ID 的 return 值,在以后的更新中使用该 ID。int id = db.insert
db.update(..., ..., "WHERE " + FoodEntry.ID + "=?", new String[] { String.valueOf(id) } )
如果它应该为每个项目创建一个新行,则将
db.update
替换为db.insert
- 如果您使用第二种方法,您需要确保在读回数据时,您通过 ID 或使用排序
FoodEntry.COLUMN_DATE + " asc"
读取了正确的行
- 如果您使用第二种方法,您需要确保在读回数据时,您通过 ID 或使用排序
对于调试数据库的东西,我真的推荐 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);
以上代码很简单,可以获取当前日期和时间。