如何使用DBFlow按月获取数据?

时间:2015-08-17 21:35:15

标签: android sqlite

我正面临一些问题,尝试在我的应用中从我的数据库中按月获取月份列表和数据列表。现在我使用SQLite的strftime()函数,但显然strftime()不起作用。 为了构建和管理数据库,我使用DBFlow ORM,第一个列表的查询就是这样。

List<ExpenseAndIncome> expenseAndIncomes = new Select("strftime('%Y-%m-%d', date").from(ExpenseAndIncome.class).queryList();

SELECT `strftime('%Y-%m-%d', date)` FROM `expense_and_income` 

在这种情况下,它会显示异常

android.database.sqlite.SQLiteException: no such column: strftime('%Y-%m-%d', date) (code 1): , while compiling: SELECT `strftime('%Y-%m-%d', date)` FROM `expense_and_income`

当我试图按月获取数据列表时,会出现另一个问题。在这种情况下,查询看起来像那样。

List<ExpenseAndIncome> expenseAndIncomes = new Select().from(ExpenseAndIncome.class).where("strftime('%m', date) = ?", calendar.get(Calendar.MONTH)).groupBy("date").queryList();

SELECT * FROM `expense_and_income` WHERE strftime('%m', date) = 7 GROUP BY date 

但结果总是一个空数组。

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

strftime只是一个将Date变量格式化为字符串的函数。例如,strftime('%Y-%m-%d', date)可能会返回'2015-08-17'

然后,您的查询将被评估为:

SELECT 2015-08-17 FROM expense_and_income

那不是你想要的。我想你想要更像的东西:

SELECT UNIQUE month FROM expense_and_income

假设你有一个名为month的字段,那就是。

您的第二个查询正在评估为

SELECT * FROM expense_and_income WHERE 08 = 7 GROUP BY date

显然,8!= 7,所以虽然这是一个有效的查询,但它永远不会返回任何内容。你可能想要更像

的东西
SELECT * FROM expense_and_income WHERE month = 08

答案 1 :(得分:0)

我想出了如何解决其中一个问题,按月收集数据列表。

当Android在SQLite中执行以下行时

List<ExpenseAndIncome> expenseAndIncomes = new Select().from(ExpenseAndIncome.class).where("strftime('%m', date) = ?", calendar.get(Calendar.MONTH)).groupBy("date").queryList();

查询表示

SELECT * FROM `expense_and_income` WHERE strftime('%m', date) = 7 GROUP BY date

他们比较那样的东西

SELECT * FROM `expense_and_income` WHERE '08' = 7 GROUP BY date

这是因为我的日期表将日期保存为字符串,而calendar.get(Calendar.MONTH)返回一个int作为月份表示,并且int从0开始。因此,august由int 7表示,而不是8字符串&#39; 08&#39 ;. SQLite查询比较&#39; 08&#39;使用int 7,因此该数组总是返回空。

为了解决这个问题,我创建了一个方法,该方法返回一个正确的字符串表示形式,用于查询比较。最终的代码看起来像这样:

List<ExpenseAndIncome> expenseAndIncomes = new Select().from(ExpenseAndIncome.class).where("strftime('%m', date) = ?", getMonthAsString(calendar.get(Calendar.MONTH))).groupBy("date").queryList();

private String getMonthAsString(int month) {
    if (month > 0 && month < Constants.OCTOBER)
        return Constants.ZERO + (Integer.toString(month) + 1);
    return Integer.toString((month + 1));
}