是否有一种更简单的方法来分组和显示SQLite数据库中的数据,而不是我要建议的数据?如果是这样,你会如何改进它?
在我正在为健身房做的应用中,我需要能够按日期,按降序(最新的)记录5种运动类的历史记录。本着共享代码的精神来更好地理解,这是我的表创建:
private static final String CREATE_TABLE_BJJ = "CREATE TABLE IF NOT EXISTS "
// TODO finish this
+ TABLE_BJJ + "(" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ BJJ_HISTORY_MOVE + " TEXT NOT NULL, " + BJJ_HISTORY_MOVECOUNT + " INTEGER NOT NULL, "
+ BJJ_HISTORY_PERFORMEDBY + " TEXT NOT NULL, " + BJJ_HISTORY_PERFORMEDTO
+ " TEXT NOT NULL, " + DATE + " datetime NOT NULL, " + UPLOADED
+ " INTEGER NOT NULL DEFAULT 0);";
一旦数据被记录,这会产生类似的结果:
对于历史页面,我需要以某种方式将按日期执行的所有动作分组为一行,并且执行的动作数量总和,如下面的屏幕截图所示:
我认为可能会工作的是使用 SELECT DISTINCT STATEMENT 的结果填充数组,然后用如下结果填充数组: < / p>
String query ="SELECT DISTINCT Date FROM BJJHistory";
ArrayList<String> dateList = new ArrayList<String>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Cursor cursor = database.rawQuery(query,null);
if (cursor != null) {
cursor.moveToFirst();
if (!cursor.isAfterLast())
{
do
{
String datestr = sdf.format(new Date(cursor.getString(0)));
dateList.add(datestr);
}
while (cursor.moveToNext());
}
}
return cursor;
我有一个自定义类来保存结果:
Public class History {
public String numMoves;
public String date;
public History() {
super();
}
public History(final String numMoves, final String date) {
super();
this.numMoves = numMoves;
this.date = date;
}
}
然后,使用数组创建游标以将数据拉回原样:
final ArrayList<History> BJJHistory = new ArrayList<History>();
for (int i = 0; dateList.size(); i++) {
final Cursor cursor = db.rawQuery("SELECT COUNT(*) FROM BJJHistory WHERE Date LIKE '" + dateList(i).toString() + "%'") > 0, null);
if (cursor != null) {
cursor.moveToFirst();
BJJHistory.add(new History(cursor.getString(0).toString(),dateList[i].toString()))
}
很多打字
最后,使用数组适配器使用生成的历史记录项的arraylist填充listview。我仍然需要使用一种方法来实现一个onclick监听器,它将在数据库中查询每个日期的所有项目,这样用户就可以看到他们在那个日期做了什么动作,但主列表视图现在更重要。
一如既往,提前致谢!
答案 0 :(得分:1)
GROUP BY
clause做你想做的事; date
function也有帮助:
SELECT COUNT(*), date("Date") FROM BJHistory GROUP BY date("Date")
答案 1 :(得分:0)
我最终得到它与我上面发布的略微修改版本一起工作。对于任何感兴趣的人,这是我的代码(可能会改进):
首先,我从表格中获取所有独特日期:
public String[] getUniqueDates(final String tablename) {
final String query = "SELECT DISTINCT Date FROM " + tablename
+ " ORDER BY Date DESC";
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
final SimpleDateFormat sourceFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
final Cursor cursor = database.rawQuery(query, null);
String datestr = null;
final Set<String> set = new LinkedHashSet<String>();
if (cursor != null) {
cursor.moveToFirst();
if (!cursor.isAfterLast()) {
do {
// Convert the date to YYYY-MM-DD
try {
final Date dt = sourceFormat.parse(cursor.getString(0));
datestr = sdf.format(dt);
} catch (final ParseException e) {
e.printStackTrace();
}
set.add(datestr);
} while (cursor.moveToNext());
}
cursor.close();
}
return set.toArray(new String[0]);
}
然后我的数据库访问类中有一个类,它选择与日期匹配的日期数:
public String selectCount(final String date) {
String count = "";
final Cursor cursor = database.rawQuery("SELECT COUNT(*) FROM "
+ SQLiteHelper.TABLE_BJJ + " WHERE Date LIKE '" + date
+ "%'", null);
if (cursor != null) {
cursor.moveToFirst();
count = cursor.getString(0);
cursor.close();
}
return count;
}
将数据放入ListView的肉和土豆:
String[] DateArray = datasource.getUniqueDates(SQLiteHelper.TABLE_BJJ);
final History BJJHistoryArray[] = new History[DateArray.length];
for (int i = 0; i < DateArray.length; i++) {
String suffix;
if (datasource.selectCount(DateArray[i]).equals("1"))
suffix = " Move";
else
suffix = " Moves";
BJJHistoryArray[i] = new History(datasource.selectCount(DateArray[i]) + suffix,
DateArray[i]);
}
final HistoryAdapter adapter = new HistoryAdapter(this, R.layout.history_row,
BJJHistoryArray);
BJJHistory.setAdapter(adapter);
结果如下:
当使用日志条目按钮记录新条目时,它会刷新查询,从而每次更新数字1
。
需要改进的地方:
selectCount()
方法添加参数,以便可以在任何表格上使用。