按日期我有一个存有金钱项目的表格 有些货币项目是贷款,其他货币则是借入。
我想要做的是,放入ListView 3元素:日期,此日期的贷款金额总和,此日期借入金额的总和。
以下是填写光标的代码:
Cursor cursor = mDb.rawQuery("SELECT date_o, loan, borrow FROM " +
"(SELECT strftime('%m', date) as date_o, SUM(amount) as loan FROM " +
"(SELECT date, amount FROM " + DATABASE_TABLE + " WHERE date > date('now', '-6 months') AND TYPE = " + ActivityClass.DATABASE_LOAN_TYPE + " ORDER BY date DESC) " +
"GROUP BY strftime('%m', date) " +
"UNION ALL " +
"SELECT strftime('%m', date) as date_o, SUM(amount) as borrow FROM " +
"(SELECT date, amount FROM " + DATABASE_TABLE + " WHERE date > date('now', '-6 months') AND TYPE = " + ActivityClass.DATABASE_BORROW_TYPE + " ORDER BY date DESC) " +
"GROUP BY strftime('%m', date)) GROUP BY date_o", null);
这是填充我的ListView的代码:
List<List<Float>> amountByMonth = new ArrayList<>();
List<Float> data = new ArrayList<>();
if (cursor.moveToFirst()) {
do {
data.add(Float.parseFloat(cursor.getString(0)));
data.add(Float.parseFloat(cursor.getString(1)));
data.add(Float.parseFloat(cursor.getString(2)));
amountByMonth.add(data);
}
while (cursor.moveToNext());
}
所以我的函数返回List<List<Float>>
。
我得到的问题是:
Couldn't read row 0, col 2 from CursorWindow
所以我的调查显示cursor.getString(2)
不存在(抛出异常),我认为我的查询构造错误。
表格详情如下:
private static final String TABLE_MONEY = "money",
KEY_MONEY_ID = "id",
KEY_MONEY_TITLE = "title",
KEY_MONEY_AMOUNT = "amount",
KEY_MONEY_DETAILS = "details",
KEY_MONEY_DATE = "date",
KEY_MONEY_TYPE_FK_ID = "type",
KEY_MONEY_CONTACT_FK_ID = "contact",
KEY_MONEY_REMINDER_FK_ID = "reminder";
如果您需要进一步的详细信息,请不要犹豫。
编辑:我在//中进行测试后修改了我的查询。 我在这里得到的问题是列借用是未知的。
答案 0 :(得分:1)
目前,您只选择 2 时会假装阅读 3 列:SELECT strftime('%m', date) as date_o, SUM(amount) as loan ...
使用UNION
子句时,所有子查询中必须包含相同列(loan
和borrow
不相同列)。
您可以在各自的子查询中使用0 AS borrow
和0 AS loan
作为第3列的假列占位符。
即:
Cursor cursor = mDb.rawQuery("SELECT date_o, loan, borrow FROM " +
"(SELECT strftime('%m', date) as date_o, SUM(amount) as loan, 0 AS borrow FROM " +
"(SELECT date, amount FROM " + DATABASE_TABLE + " WHERE date > date('now', '-6 months') AND TYPE = " + ActivityClass.DATABASE_LOAN_TYPE + " ORDER BY date DESC) " +
"GROUP BY strftime('%m', date) " +
"UNION ALL " +
"SELECT strftime('%m', date) as date_o, 0 AS loan, SUM(amount) as borrow FROM " +
"(SELECT date, amount FROM " + DATABASE_TABLE + " WHERE date > date('now', '-6 months') AND TYPE = " + ActivityClass.DATABASE_BORROW_TYPE + " ORDER BY date DESC) " +
"GROUP BY strftime('%m', date)) GROUP BY date_o", null);