从android sqlite数据生成月度报告?

时间:2018-03-27 07:30:42

标签: android sqlite android-sqlite report

我正在尝试根据SQLiteDatabase中存储的数据生成每月财务报告。以下代码返回null日期

 String selectQuery = "SELECT id, STRFTIME('%Y-%m',_date) AS _date, SUM(amount) AS amount, _type FROM personal_finance GROUP BY _date, _type";

    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    if (cursor.moveToFirst()) {
        do {
            Finance finance = new Finance();
            finance.setId(cursor.getInt(0));
            finance.setDate(cursor.getString(1));
            finance.setAmount(cursor.getInt(2));

            finances.add(finance);
        } while (cursor.moveToNext());
    }

enter image description here

1 个答案:

答案 0 :(得分:0)

我建议null问题是由于_date列中存储的值不是可接受/可识别的日期格式之一,因为查询本身似乎可以正常工作(稍后会看到它是如何工作的)虽然没有按预期工作

例如,假设一个表填充为: -

enter image description here

  • 请注意_date是可接受/识别的格式,按照
  

时间字符串时间字符串可以采用以下任何格式:

     

YYYY-MM-DD

     

YYYY-MM-DD HH:MM

     

YYYY-MM-DD HH:MM:SS

     

YYYY-MM-DD HH:MM:SS.SSS

     

YYYY-MM-DDTHH:MM

     

YYYY-MM-DDTHH:MM:SS

     

YYYY-MM-DDTHH:MM:SS.SSS

     

HH:MM

     

HH:MM:SS

     

HH:MM:SS.SSS

     

now

     

DDDDDDDDDD

Date And Time Functions

然后您的查询将导致: -

enter image description here

<强> 1。因此,基础数据导致空。

从结果中您还可以看到数据未按月分组,因此按日期汇总。这是因为年/月派生列的名称与源列相同,即_date,但它是GROUP将使用的实际_date列。

这是一个简单的更改,只需为派生列使用不同的名称,然后在GROUP子句中使用它。例如:

SELECT id, STRFTIME('%Y-%m',_date) AS short_date, SUM(amount) AS amount FROM personal_finance GROUP BY short_date, _type
  • short_date 而不是_date已用于派生列,然后已用于GROUP。

这导致: -

enter image description here

  • 注意! id 仅会指示该集合的 id 之一。