Не удалось прочитать строку 0, столбец 2 из CursorWindow. Убедитесь, что курсор инициализирован правильно, прежде чем получить доступ к данным из него - PullRequest
0 голосов
/ 10 июня 2019

В моем приложении у меня есть форма.В котором пользователь ставит CNIC первым.Если его CNIC уже существует в базе данных SQLite.Имя пользователя и номер мобильного телефона будут автоматически заполнены в текстовых окнах (с помощью TextWatcher).Но всякий раз, когда я набираю тот же CNIC, приложение вылетает.Если CNIC существует в базе данных, вместо автоматического заполнения имени и поля телефона, приложение вылетает.Я очень старался, но не смог решить мою проблему.

Метод запроса:

public List<SGenerateModel> getGeneratedData(String seller_cnic){
    SQLiteDatabase db = this.getWritableDatabase();
    String query = "SELECT " + TABLE_COL2 + ", " + TABLE_COL3 + " FROM " + TABLE_NAME + " WHERE " + TABLE_COL4 + " =?" ;
    Cursor cursor = db.rawQuery(query, new String[]{"" + seller_cnic});

    List<SGenerateModel> listOfSGModel = new ArrayList<>();
    while(cursor.moveToNext()){
        SGenerateModel sGenerateModel = new SGenerateModel(cursor.getString(1), cursor.getString(2));
        sGenerateModel.setId(cursor.getInt(cursor.getColumnIndex(DatabaseHelper.TABLE_COL1)));
        listOfSGModel.add(sGenerateModel);
    }
    return listOfSGModel;
}

Метод запроса:

   public void generate(){

    if (etSname != null)
        selName = (!etSname.getText().toString().equals("")?
                etSname.getText().toString() : "NULL");

    if (etSphone != null)
        selPhone = (!etSphone.getText().toString().equals("")?
                etSphone.getText().toString() : "NULL");

    if (etScnic != null)
        selCnic = (!etScnic.getText().toString().equals("")?
                etScnic.getText().toString() : "NULL");

    sGenerateModelList = databaseHelper.getGeneratedData(selCnic);
    for (SGenerateModel sGenerateModel : sGenerateModelList){
        selName = sGenerateModel.getSellerName() ;
        etSname.setText(selName);
        selPhone = sGenerateModel.getSellerMobile();
        etSphone.setText(selPhone);
    }
}

Код TextWatcher:

TextWatcher textWatcher2 = new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {
            generate();
        }
    };

etSname.addTextChangedListener(textWatcher2);
    etSphone.addTextChangedListener(textWatcher2);
    etScnic.addTextChangedListener(textWatcher2);

Ошибка LogCat:

 java.lang.IllegalStateException: Couldn't read row 0, col 2 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
    at android.database.CursorWindow.nativeGetString(Native Method)
    at android.database.CursorWindow.getString(CursorWindow.java:438)
    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
    at com.example.cattleapp.helpers.DatabaseHelper.getGeneratedData(DatabaseHelper.java:218)
    at com.example.cattleapp.activities.MainActivity.generate(MainActivity.java:536)
    at com.example.cattleapp.activities.MainActivity$7.afterTextChanged(MainActivity.java:241)
    at android.widget.TextView.sendAfterTextChanged(TextView.java:9485)
    at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:12080)
    at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:1262)
    at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:574)
    at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:507)
    at com.santalu.maskedittext.MaskTextWatcher.format(MaskTextWatcher.kt:67)
    at com.santalu.maskedittext.MaskTextWatcher.afterTextChanged(MaskTextWatcher.kt:21)
    at android.widget.TextView.sendAfterTextChanged(TextView.java:9485)

1 Ответ

2 голосов
/ 10 июня 2019
String query = "SELECT " + TABLE_COL2 + ", " + TABLE_COL3 + " FROM " + TABLE_NAME + " WHERE " + TABLE_COL4 + " =?" ;

В этой строке вы выбираете только 2 столбца (индекс 0 и 1), но при получении вы пытаетесь получить столбец № 2. Т.е.

cursor.getString(2)

Вы можете получить только столбцы 0 и 1.

Попробуйте это:

SGenerateModel sGenerateModel = new SGenerateModel(cursor.getString(0), cursor.getString(1));

EDIT:

Всегда закрывайте курсор после его использования. В вашем коде, после цикла while поместите эту строку перед return listOfSGModel в методе getGeneratedData

cursor.close();
...