Search code examples
androiddebuggingcursor

Error in accessing data from cursor in SQLite


I am working on a SQLite program and getting an error saying

2019-07-14 21:07:37.465 13538-13538/? E/CursorWindow: Failed to read row 0, column -1 from a CursorWindow which has 1 rows, 2 columns.
2019-07-14 21:07:37.466 13538-13538/? D/AndroidRuntime: Shutting down VM
2019-07-14 21:07:37.467 13538-13538/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.xyz.sqlitelist, PID: 13538
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.xyz.sqlitelist/com.example.xyz.sqlitelist.MainActivity}: java.lang.IllegalStateException:

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

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

W/ActivityManager: Force finishing activity com.example.xyz.sqlitelist/.MainActivity

String databaseToString(){
    StringBuilder dbString= new StringBuilder();
    SQLiteDatabase db = getWritableDatabase();
    String query=" SELECT * FROM " + TABLE_PRODUCTS + " WHERE 1";
    Cursor c=db.rawQuery(query,null);
    c.moveToFirst();
    while (!c.isAfterLast()){
        if(c.getString(c.getColumnIndex("productname")) != null) {
            c.moveToNext();
            dbString.append(c.getString(c.getColumnIndex("productname")));
            dbString.append("\n");
    }
    c.close();
    db.close();
    return dbString.toString();
}

Solution

  • Your column's name is "_productname" and not "productname" and this problem can be solved by not hardcoding this name since you have it in the variable COLUMN_PRODUCTNAME.
    Also your code will miss rows because you use incorrectly moveToFirst(), moveToNext() and isAfterLast() when you only need moveToNext():

    String databaseToString() {
        StringBuilder dbString = new StringBuilder();
        SQLiteDatabase db = getWritableDatabase();
        String query = "SELECT * FROM " + TABLE_PRODUCTS + " WHERE 1";
        Cursor c = db.rawQuery(query, null);
        int index = c.getColumnIndex(COLUMN_PRODUCTNAME);
        while (c.moveToNext()) {
            dbString.append(c.getString(index)).append("\n");
        }
        c.close();
        db.close();
        return dbString.toString();
    }
    

    Also that WHERE 1 in the sql statement is not needed unless you want to change it later to something meaningful.