Я получаю исключение индекса за пределами границ в SQLite

Я делаю приложение для точного перевода слов. У меня есть пара слов внутри моего sqlite, и мое приложение возвращает результат только тогда, когда запрашивается точное буквальное совпадение (строка за строкой). Моя проблема в том, что когда я выдаю запрос, я получаю исключение индекса за пределами границ в Android SQLite.

android.database.CursorIndexOutOfBoundsException: запрошен индекс 0 с размером 0

затем, когда я пытаюсь выбрать все записи, он выдает

W/System.err: android.database.CursorIndexOutOfBoundsException: запрошен индекс 24, размер 24

НИЖЕ МОЙ КОД:

package com.example.android.cebuano_tagalogtranslator;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    Button btn_clear;
    Button btn_translate_to_ceb;
    Button btn_translate_to_fil;
    EditText txt_input;
    EditText txt_output;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);



        //HABAGAT CONTROLS BEGIN
        btn_clear = (Button) findViewById(R.id.btn_clear);
        btn_translate_to_ceb = (Button) findViewById(R.id.btn_trans_to_ceb);
        btn_translate_to_fil = (Button) findViewById(R.id.btn_trans_to_fil);

        txt_input = (EditText) findViewById(R.id.input);
        txt_output = (EditText) findViewById(R.id.output);

        //HABAGAT : CLEAR BOTH TEXT
        btn_clear.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                txt_input.setText("type here");
                txt_output.setText("");
            }
        });

        //HABAGAT : FILIPINO -> CEBUANO
        btn_translate_to_ceb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {


                try {
                    String textinput = txt_input.getText().toString();
                    textinput = "\""+ textinput +"\"";
                    String filToCebQuery = "SELECT ceb FROM filtoceb WHERE fil = "+ textinput;
                    SQLiteDatabase DB = openOrCreateDatabase("filtoceb", MODE_PRIVATE, null);
                    //Cursor c = DB.rawQuery("SELECT * FROM filtoceb", null);
                    Cursor c = DB.rawQuery(filToCebQuery, null);

                    int cebIndex = c.getColumnIndex("ceb");
                    //int filIndex = c.getColumnIndex("fil");

                    c.moveToFirst();
                    while (c != null) {

                    //Log.i("Results - ceb", c.getString(cebIndex));
                    txt_output.setText(c.getString(cebIndex));
                    c.moveToNext();
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        });

        //HABAGAT : CREATE DB OPEN IF NOT CREATED YET
            try {
            SQLiteDatabase eventsDB = this.openOrCreateDatabase("filtoceb", MODE_PRIVATE, null);
            //eventsDB.execSQL("drop table user");
            eventsDB.execSQL("CREATE TABLE IF NOT EXISTS filtoceb (fil VARCHAR, ceb VARCHAR)");

            eventsDB.execSQL("INSERT INTO filtoceb (ceb, fil) VALUES ('Kumusta ka?','Kumusta ka?')");
            eventsDB.execSQL("INSERT INTO filtoceb (ceb, fil) VALUES ('Maayo, salamat', 'Mabuti naman, salamat')");
            eventsDB.execSQL("INSERT INTO filtoceb (ceb, fil) VALUES ('Unsay imong pangalan?',  'Ano pangalan mo?')");
            eventsDB.execSQL("INSERT INTO filtoceb (ceb, fil) VALUES ('Unsay ngalan mo?', 'ano pangalan mo?')");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Что я делаю неправильно?


person royjavelosa    schedule 30.11.2017    source источник
comment
while (c != null) - Это условие на самом деле не имеет смысла. Если бы c было нулевым, он бы выбросил еще до того, как туда попадет. Выполните нулевую проверку еще до того, как начнете цикл. Затем moveToFirst() и moveToNext() возвращают boolean, указывающее, может ли Cursor двигаться. Основывайте свою петлю на них.   -  person Mike M.    schedule 30.11.2017


Ответы (1)


person    schedule
comment
Он больше не выдает ошибку, но все, что он может вернуть, это первая запись моей базы данных? когда я пытаюсь использовать любые другие слова, ничего не происходит и нет ошибок в журнале? - person royjavelosa; 30.11.2017