Android应用程序的CursorIndexOutOfBoundsException

时间:2013-02-26 17:41:01

标签: android database cursor indexoutofboundsexception

尝试运行我的应用程序时,我得到的错误,我无法弄清楚出了什么问题。我得到一个光标超出绑定异常。

堆栈追踪:

 02-26 12:33:56.870: D/AndroidRuntime(1012): Shutting down VM
    02-26 12:33:56.870: W/dalvikvm(1012): threadid=1: thread exiting with uncaught exception (group=0x41452930)
    02-26 12:33:56.870: E/AndroidRuntime(1012): FATAL EXCEPTION: main
    02-26 12:33:56.870: E/AndroidRuntime(1012): java.lang.RuntimeException: Unable to create application com.example.myassistantcoach.AnotherHelper: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

这是我的代码

private void readBowlingScoresFromDB() {
        // TODO Auto-generated method stub
        allBowlingScores = new ArrayList<BowlingScores>();
        Cursor bowlingScoresCursor;
        bowlingScoresCursor = bowlingScoresDB.query(BOWLING_SCORES_TABLE,
                new String[] { RECORD_ID, DATE, GAME1, GAME2, GAME3 }, null,
                null, null, null, DATE);
        bowlingScoresCursor.moveToFirst();
        BowlingScores tempBS;
        if (!bowlingScoresCursor.isAfterLast()) {
            do {
                long id = bowlingScoresCursor.getLong(0);
                long dateEpoch = bowlingScoresCursor.getLong(1);
                int game1 = bowlingScoresCursor.getInt(2);
                int game2 = bowlingScoresCursor.getInt(3);
                int game3 = bowlingScoresCursor.getInt(4);
                tempBS = new BowlingScores(id, dateEpoch, game1, game2, game3);
                allBowlingScores.add(tempBS);
            } while (bowlingScoresCursor.moveToNext());
            bowlingScoresCursor.close();
        }
    }

    public void addBowlingScores(BowlingScores bowlingScores) {
        assert bowlingScores != null;
        ContentValues cv = new ContentValues();
        cv.put(BowlingScoresDatabaseHelper.DATE, bowlingScores.getDateEpoch()); // USE
                                                                                // EPOCH
        cv.put(BowlingScoresDatabaseHelper.GAME1, bowlingScores.getGame1());
        cv.put(BowlingScoresDatabaseHelper.GAME2, bowlingScores.getGame2());
        cv.put(BowlingScoresDatabaseHelper.GAME3, bowlingScores.getGame3());
        Log.d("Bowling Database", "Before Inserting a record" + bowlingScores);
        long idPassedBack = bowlingScoresDB.insert(
                BowlingScoresDatabaseHelper.BOWLING_SCORES_TABLE, null, cv);
        bowlingScores.setId(idPassedBack);
        allBowlingScores.add(bowlingScores);
    }

1 个答案:

答案 0 :(得分:0)

第一次通过readBowlingScoresFromDB()时,光标为空。我强烈建议使用for循环而不是使用if语句的do-while循环。这应该保持第一次迭代不运行代码,并在光标为空时跳过它。

for (bowlingScoresCursor.moveToFirst(); !bowlingScoresCursor.isAfterLast(); bowlingScoresCursor.moveToNext()) {

            long id = bowlingScoresCursor.getLong(0);
            long dateEpoch = bowlingScoresCursor.getLong(1);
            int game1 = bowlingScoresCursor.getInt(2);
            int game2 = bowlingScoresCursor.getInt(3);
            int game3 = bowlingScoresCursor.getInt(4);
            tempBS = new BowlingScores(id, dateEpoch, game1, game2, game3);
            allBowlingScores.add(tempBS);
}

bowlingScoresCursor.close();