SQLite: выберите из столбца по месяцу - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь суммировать столбец таблицы на основе месяца, но я получил следующее исключение:

   java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.

функция

public static float test(SQLiteDatabase db) {

    String expenditure = MyDatabaseContract.TableExpenditure.ATTR_EXPENDITURE;
    String table = MyDatabaseContract.TableExpenditure.TABLE_EXPENDITURE;
    String date = MyDatabaseContract.TableExpenditure.ATTR_DATE;

    String query = "SELECT SUM(" + expenditure + ") FROM " + table + " WHERE strftime('%m', date)=11";
    Cursor cursor = db.rawQuery(query, null);


    float total = 0;
    if (cursor.moveToFirst())
        total = cursor.getInt(cursor.getColumnIndex("Total"));// get final total

    return total;
}

таблица

public static class TableExpenditure {

    public static final String TABLE_EXPENDITURE = "expenditure_table";

    public static final String ATTR_PRIMARY_KEY = "pk_expendituretable";
    public static final String ATTR_DATE = "date";
    public static final String ATTR_CATEGORY = "category";
    public static final String ATTR_EXPENDITURE = "expenditure";
    public static final String ATTR_COMMENT = "comment";

    public static final int N_COLUMNS = 5;

    public static final String SQL_CREATE_TABLE =
            "CREATE TABLE " + TABLE_EXPENDITURE + "(" + ATTR_PRIMARY_KEY + " INTEGER PRIMARY KEY AUTOINCREMENT," +  ATTR_DATE + " DATE," + ATTR_CATEGORY + " TEXT," +
                    ATTR_EXPENDITURE + " REAL," + ATTR_COMMENT + " TEXT"  + ")";
}

В отладчике курсор содержит один элемент, но при вызове getInt (..) приложение вылетает

1 Ответ

0 голосов
/ 19 декабря 2018

Столбец, созданный для этого результата:

SUM(" + expenditure + ")

не называется Total.Измените выражение sql следующим образом:

String query = "SELECT SUM(" + expenditure + ") AS Total FROM " + table + " WHERE strftime('%m', date)=11";

Таким образом, вы дадите имя (псевдоним) Total столбцу.Или, поскольку возвращен только 1 столбец, выполните следующее:

total = cursor.getInt(0);
...