Как правильно инициализировать курсор? - PullRequest
1 голос
/ 23 января 2020

Я пытаюсь вызвать запрос к базе данных и получить доступ к данным. Запрос работает нормально, и курсор перемещается на первый в android device1, но не в android device2. В device2 это показывает эту ошибку

E/CursorWindow: Failed to read row 0, column -1 from a CursorWindow which has 2 rows, 7 columns.
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.stock_design, PID: 25451
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.stock_design/com.example.stock_design.Edit}: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
    at android.app.ActivityThread.access$900(ActivityThread.java:150)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)

Это класс контроллера базы данных

val getEdit:List<Item_Edit> get(){
    val db=context.openOrCreateDatabase(REAL_DATABASE, Context.MODE_PRIVATE, null)

    val query ="With cte as (SELECT * FROM Transaction_table ORDER BY (CASE WHEN isbn = '$edt_isbn'  AND location = '$edt_lc' AND branch = '$edt_br'THEN 2 ELSE 1  END), branch) SELECT T.isbn,T.branch,T.location,T.qty,M.article,M.description,M.price FROM cte T LEFT JOIN Master M  WHERE T.isbn = M.isbn"

    val cursor = db.rawQuery(query,null)
    println(edt_isbn)
    if (cursor.moveToFirst()) {

        do {
            seItem.add(Item_Edit(cursor.getString(cursor.getColumnIndex("branch")),
                cursor.getString(cursor.getColumnIndex("location")),
                cursor.getString(cursor.getColumnIndex("isbn")),
                cursor.getString(cursor.getColumnIndex("article")),
                cursor.getString(cursor.getColumnIndex("description")),
                cursor.getString(cursor.getColumnIndex("price")),
                cursor.getString(cursor.getColumnIndex("qty")) ))

        } while(cursor.moveToNext())
    }

    else{
       ck_edt = "false"
    }
    db.close()
    return seItem
}

Ответы [ 2 ]

1 голос
/ 23 января 2020

Эта ошибка возникает только на устройстве 2?

Если это так, то ошибка может быть в схеме этого устройства.

failed to read row 0,column -1

означает, что вы пытаетесь читать из несуществующего столбца.

Проверьте, есть ли в именах столбцов орфографические ошибки. Кроме того, имена столбцов чувствительны к регистру, поэтому проверьте это.

0 голосов
/ 23 января 2020

Ну, я изменил, используя имя столбца на индекс столбца, и он работает нормально. Я действительно не понимаю, почему это работает на device1, а не на device2, когда я использую имя столбца. По крайней мере, проблема решена. Я изменил на

 seItem.add(Item_Edit(cursor.getString(1),
                cursor.getString(2),
                cursor.getString(0),
                cursor.getString(4),
                cursor.getString(5),
                cursor.getString(6),
                cursor.getString(3) ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...