我正面临一些问题,尝试在我的应用中从我的数据库中按月获取月份列表和数据列表。现在我使用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
但结果总是一个空数组。
有人可以帮助我吗?
答案 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));
}