Я делаю приложение для точного перевода слов. У меня есть пара слов внутри моего 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();
}
}
}
Что я делаю неправильно?
while (c != null)
- Это условие на самом деле не имеет смысла. Если быc
было нулевым, он бы выбросил еще до того, как туда попадет. Выполните нулевую проверку еще до того, как начнете цикл. ЗатемmoveToFirst()
иmoveToNext()
возвращаютboolean
, указывающее, может лиCursor
двигаться. Основывайте свою петлю на них. - person Mike M.   schedule 30.11.2017