我首先将SQLite数据库中的信息检索到游标中。
游标包含格式为yyyy-MM-dd HH:mm:ss.SSS
的时间戳列,例如2010-08-27 21:25:30.575
检索完毕后,我设置SimpleCursorAdapter
就像这样(代码简化):
SimpleCursorAdapter adapter =
new SimpleCursorAdapter(this, R.layout.row_layout, cursor, new String{KEY_TITLE, KEY_TIMESTAMP}, new int[]{ R.id.title, R.id.timestamp } );
setListAdapter(adapter);
代码以上述格式成功显示时间和日期,但我想只显示DD / MM / YYYY格式的日期(如果可能,也可以显示基于区域设置的用户格式)。
如何干预SimpleCursorAdapter以将日期更改为我的首选格式?
N.B。如果它简化了问题,我愿意改变信息传递给适配器的方式。如果SQLite有内置的格式化程序,我也不介意更改游标的SQLite查询。
答案 0 :(得分:1)
查询方式:
SELECT strftime('%d/%m/%Y',TimeStampField) FROM MyTable...
因为SQLite将返回所有字段的字符串,所以您需要为SimpleCursorAdaptor执行的操作是解析日期然后对其进行转换。我很想说首先由SQLite完成它更简单,更清洁。
答案 1 :(得分:1)
这是我的最终解决方案。
请注意,这是一个让SQLite重新格式化检索日期的黑客攻击。更好的解决方案是存储日期并自行检索。
拥有检索键的字段:
public static final String KEY_TIMESTAMP = "timestamp";
public static final String KEY_DATESTAMP =
"strftime('%d/%m/%Y'," + KEY_TIMESTAMP +")";
将正常时间戳存储在数据库条目中:
String timeStamp = new Timestamp(
Calendar.getInstance().getTimeInMillis() ).toString();
ContentValues initialValues = new ContentValues();
...
initialValues.put(KEY_TIMESTAMP, timeStamp);
return mDb.insert(DATABASE_TABLE, null, initialValues);
其中mDb是SQLiteDatabase对象。
以yyyy-MM-dd HH:mm:ss.SSS
格式检索时间戳时,请使用常规KEY_TIMESTAMP
。
以下方法检索包含两个项目的行。使用适当的密钥进行检索。
public Cursor fetchItem(long rowId) throws SQLException {
Cursor cursor =
mDb.query(true, DATABASE_TABLE,
new String[] {KEY_ITEMID,KEY_TIMESTAMP,KEY_DATESTAMP},
KEY_ITEMID + "=" + rowId,
null, null, null, null, null
);
return cursor;
}
使用适当的密钥进行检索
mTimestamp = quote.getString(
quote.getColumnIndex(QuotesDbAdapter.KEY_TIMESTAMP)));
mDatestamp = quote.getString(
quote.getColumnIndex(QuotesDbAdapter.KEY_DATESTAMP)));
答案 2 :(得分:0)
也可以使用ViewBinder类格式化日期。这里有一个很好的例子:http://ambiguiti.es/2009/04/making-custom-rows-in-android-listviews/