Android App:错误:Android.database.CursorIndexOutOfBoundsException:请求索引0,大小为0

时间:2017-12-18 20:00:17

标签: java android xml sqlite

我有问题,你可以在下面看到。请帮我。我是Android App的初学者。预先感谢您的帮助。我收到以下错误:

  

错误:android.database.CursorIndexOutOfBoundsException:索引0   请求,大小为0

我不知道如何解决它。

这是我的数据库助手类: -

public class DbObsluha extends SQLiteOpenHelper{

    private static String DB_JMENO = "Databaze.db";
    private static String DB_CESTA ="";
    private static final int DB_VERZE = 2;
    private SQLiteDatabase databaze;
    private Context mContext = null;

    public DbObsluha(Context context) {
        super(context, DB_JMENO, null, DB_VERZE);
        DB_CESTA = context.getApplicationInfo().dataDir + "/databases/";

        File file = new File(DB_CESTA + "Databaze.db");
        if(file.exists())
            otevreniDatabaze();

        this.mContext = context;

        /*
        this.DB_CESTA = this.mContext.getDatabasePath(DB_JMENO).getAbsolutePath();
        Log.e("Path 1", DB_CESTA);
        */
    }

    public void otevreniDatabaze() {
        String mojeCesta = DB_CESTA + DB_JMENO;
        databaze = SQLiteDatabase.openDatabase(mojeCesta, null, SQLiteDatabase.OPEN_READWRITE);
    }

    public void kopirovanoDatabaze() throws IOException {
        try {
            InputStream mujVstup = mContext.getAssets().open(DB_JMENO);
            String vystupniNazevSouboru = DB_CESTA + DB_JMENO;
            OutputStream mujVystup = new FileOutputStream(vystupniNazevSouboru);

            byte[] buffer = new byte[1024];
            int velikost;
            while((velikost = mujVstup.read(buffer)) > 0)
                mujVystup.write(buffer, 0, velikost);

            mujVystup.flush();
            mujVystup.close();
            mujVstup.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    private boolean overeniDataze()  {
        SQLiteDatabase tempDB = null;
        try {
            String mojeCesta = DB_CESTA + DB_JMENO;
            tempDB = SQLiteDatabase.openDatabase(mojeCesta, null, SQLiteDatabase.OPEN_READWRITE);

        }catch (SQLiteException e) {
            e.printStackTrace();
        }
        if(tempDB != null)
        {
            tempDB.close();
        }
        return tempDB != null ? true : false;
    }

    public void vytvoreniDatabaze() throws IOException {
        boolean existenceDatabaze = overeniDataze();
        if (existenceDatabaze) {

        }else  {
            this.getReadableDatabase();
            try {
                kopirovanoDatabaze();
            }catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    /*
    @Override
    public synchronized void close() {
        if(databaze != null)
            databaze.close();
        super.close();
    }
    */

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if(newVersion>oldVersion)
            try {
                kopirovanoDatabaze();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }

    //zobrazenu for table
    public List<Otazky> vsechnyOtazky(){
        List<Otazky> seznamOtazek = new ArrayList<>();
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor c;
        try {
            c = db.rawQuery("SELECT * FROM Otazky ORDER BY Random()", null);
            if(c == null) return  null;
            c.moveToFirst();
            do {
                int Id = c.getInt(c.getColumnIndex("ID"));
                String Otazka = c.getString(c.getColumnIndex("Otazka"));
                String OdpovedA = c.getString(c.getColumnIndex("OdpovedA"));
                String OdpovedB = c.getString(c.getColumnIndex("OdpovedB"));
                String OdpovedC = c.getString(c.getColumnIndex("OdpovedC"));
                String OdpovedD = c.getString(c.getColumnIndex("OdpovedD"));
                String Vysledek = c.getString(c.getColumnIndex("Vysledek"));

                Otazky otazky = new Otazky(Id, Otazka, OdpovedA, OdpovedB, OdpovedC, OdpovedD, Vysledek);
                seznamOtazek.add(otazky);
            }
            while (c.moveToNext());
            c.close();
        }catch (Exception e){
            e.printStackTrace();
        }
        db.close();
        return seznamOtazek;
    }

    //upraveni pro aktivitu Hra
    public List<Otazky> vsechnyOtazkyUroven(String uroven){
        List<Otazky> seznamOtazek = new ArrayList<>();
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor c;
        int konec = 0;

        if(uroven.equals(Urovne.UROVEN.LEHKÁ.toString()))
            konec = 5;
        else if(uroven.equals(Urovne.UROVEN.STŘEDNÍ.toString()))
            konec = 10;
        else if(uroven.equals(Urovne.UROVEN.TĚŽKÁ.toString()))
            konec = 15;
        else if(uroven.equals(Urovne.UROVEN.LEGENDÁRNÍ.toString()))
            konec = 20;

        try {
            c = db.rawQuery(String.format("SELECT * FROM Otazky ORDER BY Random() LIMIT %d", konec), null);
            if(c == null) return  null;
            c.moveToFirst();
            do {
                int Id = c.getInt(c.getColumnIndex("ID"));
                String Otazka = c.getString(c.getColumnIndex("Otazka"));
                String OdpovedA = c.getString(c.getColumnIndex("OdpovedA"));
                String OdpovedB = c.getString(c.getColumnIndex("OdpovedB"));
                String OdpovedC = c.getString(c.getColumnIndex("OdpovedC"));
                String OdpovedD = c.getString(c.getColumnIndex("OdpovedD"));
                String Vysledek = c.getString(c.getColumnIndex("Vysledek"));

                Otazky otazky = new Otazky(Id, Otazka, OdpovedA, OdpovedB, OdpovedC, OdpovedD, Vysledek);
                seznamOtazek.add(otazky);
            }while (c.moveToNext());
            c.close();
        }catch (Exception e){
            e.printStackTrace();
        }

        db.close();
        return seznamOtazek;
    }

    //Vložení skore do žebříčku
    public void vlozeniSkore(double skore){
        /*SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put("Skore", Skore);
        db.insert("Zebricek", null, contentValues);
        */

        String query = "INSERT INTO Zebricek(Skore) VALUES("+ skore +")";
        databaze.execSQL(query);
    }

    //get score and sort ranking
    public List<Zebricek> getZebricek(){
        List<Zebricek> seznamZebricku = new ArrayList<>();
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor c;
        try {
            c = db.rawQuery("SELECT * FROM Zebricek ORDER BY Skore DESC", null);
            if (c == null) return null;
            c.moveToNext();
            do {
                int Id = c.getInt(c.getColumnIndex("ID"));
                double Skore = c.getDouble(c.getColumnIndex("Skore"));

                Zebricek zebricek = new Zebricek(Id, Skore);
                seznamZebricku.add(zebricek);
            }while (c.moveToNext());
            c.close();
        }catch (Exception e){
            e.printStackTrace();
        }
        db.close();
        return seznamZebricku;
    }
}

这是活动类: -

public class Hra extends AppCompatActivity implements View.OnClickListener{

    final static long INTERVAL = 1000; // 1 sekunda
    final static long KONEC = 7000; // 7 sekund

    int meziSkore = 0;

    CountDownTimer countDownTimer; //odpočítavadlo pro meziSkore

    List<Otazky> otazkyHra = new ArrayList<>(); // všechny otazky

    DbObsluha db;
    int index = 0, skore = 0, thisOtazka = 0, vsechnyOtazky, spravnaOdpoved;
    String uroven="";

    //Ovládání
    ProgressBar progressBar;
    Button btnA, btnB, btnC, btnD;
    TextView txtSkore, txtOtazka, txtZadani;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hra);

        //data z hlavní aktivity
        Bundle extra = getIntent().getExtras();

        if(extra != null)
            uroven = extra.getString("UROVEN");

        db = new DbObsluha(this);

        txtSkore = (TextView)findViewById(R.id.txtSkore);
        txtOtazka = (TextView)findViewById(R.id.txtOtazka);
        txtZadani = (TextView)findViewById(R.id.txtZadani);
        progressBar = (ProgressBar)findViewById(R.id.progessBar);
        btnA = (Button)findViewById(R.id.btnOdpovedA);
        btnB = (Button)findViewById(R.id.btnOdpovedB);
        btnC = (Button)findViewById(R.id.btnOdpovedC);
        btnD = (Button)findViewById(R.id.btnOdpovedD);

        btnA.setOnClickListener(this);
        btnB.setOnClickListener(this);
        btnC.setOnClickListener(this);
        btnD.setOnClickListener(this);
    }

    @Override
    protected void onResume() {
        super.onResume();

        otazkyHra = db.vsechnyOtazkyUroven(uroven);
        vsechnyOtazky = otazkyHra.size();

        countDownTimer = new CountDownTimer(KONEC, INTERVAL) {
            @Override
            public void onTick(long millisUntilFinished) {
                progressBar.setProgress(meziSkore);
                meziSkore++;
            }

            @Override
            public void onFinish() {
                countDownTimer.cancel();
                ukazOtazku(++index);
            }
        };
        ukazOtazku(index);
    }

    private void ukazOtazku(int index) {
        if(index < vsechnyOtazky)
        {
            thisOtazka++;
            txtOtazka.setText(String.format("%d/%d", thisOtazka, vsechnyOtazky));
            progressBar.setProgress(0);
            meziSkore = 0;

            txtZadani.setText(otazkyHra.get(index).getOtazka());
            btnA.setText(otazkyHra.get(index).getOdpovedA());
            btnB.setText(otazkyHra.get(index).getOdpovedB());
            btnC.setText(otazkyHra.get(index).getOdpovedC());
            btnD.setText(otazkyHra.get(index).getOdpovedD());

            countDownTimer.start();
        }
        else{
            Intent intent = new Intent(this,Vysledek.class);
            Bundle odeslaniDat = new Bundle();
            odeslaniDat.putInt("SKORE",skore);
            odeslaniDat.putInt("VSECHNYOTAZKY",vsechnyOtazky);
            odeslaniDat.putInt("SPRAVNAODPOVED",spravnaOdpoved);
            intent.putExtras(odeslaniDat);
            startActivity(intent);
            finish();
        }
    }

    @Override
    public void onClick(View v) {
        countDownTimer.cancel();
        if(index < vsechnyOtazky){
            Button zmacknuteTlacitko = (Button)v;
            if(zmacknuteTlacitko.getText().equals(otazkyHra.get(index).getVysledek()))
            {
                skore+=10; //zvětšení skore
                spravnaOdpoved++; //zvětšená správné odpovědi
                ukazOtazku(++index);
            }
            else {
                ukazOtazku(++index); // pokud zvolí dobře, následuje další otázka
            }
            txtSkore.setText(String.format("%d", skore));
        }
    }
}

enter image description here

2 个答案:

答案 0 :(得分:1)

您的光标为空。您无法从空光标读取任何数据,因此例外。

如果移动未成功,moveToFirst()moveToNext()都将返回false。你忽略了moveToFirst()的结果,并尝试从光标读取导致异常。

答案 1 :(得分:0)

当您使用数据库时,最好在循环之前检查记录以检索它们(如果有的话)。

最好的方法是使用 getCount 类的 Cursor 方法。

Cursor c = db.rawQuery(String.format("SELECT * FROM Otazky ORDER BY Random() LIMIT %d", konec), null);

if (c != null && c.getCount() > 0) {
   /* Code Here */
}