2013-05-07 57 views
1

所以,我的应用程序在用户崩溃报告中出现此错误。以下是报告:android.database.CursorIndexOutOfBoundsException ...再次

android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0 
at android.database.AbstractCursor.checkPosition(AbstractCursor.) 
at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.) 
at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50) 
at rs.androidaplikacije.zastaveigradovi.Kviz10Hard.nextQuestionGrad(Kviz10Hard.) 
at rs.androidaplikacije.zastaveigradovi.Kviz10Hard.access$1(Kviz10Hard.) 
at rs.androidaplikacije.zastaveigradovi.Kviz10Hard$2.run(Kviz10Hard.java:68) 
at android.os.Handler.handleCallback(Handler.) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.) 
at android.app.ActivityThread.main(ActivityThread.) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.) 
at dalvik.system.NativeStart.main(Native Method) 

而这里提到的代码:

private void nextQuestionGrad() { 

    flag.setVisibility(View.GONE); 
    dodatnoPitanje.setVisibility(View.VISIBLE); 

    TestAdapter mDbHelper = new TestAdapter(this); 
    DataBaseHelper myDbHelper = new DataBaseHelper(this); 

    if(!myDbHelper.checkDataBase()){ 
     mDbHelper.createDatabase(); 
    } 

    try{ 

     mDbHelper.open(); 

     Cursor c = mDbHelper.getTestDataGradovi(mCurrentID); 

     List<Answer> labels = new ArrayList<Answer>(); 

     labels.add(new Answer(c.getString(2), true)); 
     labels.add(new Answer(c.getString(3), false)); 
     labels.add(new Answer(c.getString(4), false)); 
     labels.add(new Answer(c.getString(5), false)); 

     tacanOdg = c.getString(2); 

     Collections.shuffle(labels); 

     dodatnoPitanje.setText(c.getString(1)); 

     bOdgovor1.setText(labels.get(0).option); 
     bOdgovor1.setTag(labels.get(0)); 
     bOdgovor1.setOnClickListener(clickListenerGrad); 

     bOdgovor2.setText(labels.get(1).option); 
     bOdgovor2.setTag(labels.get(1)); 
     bOdgovor2.setOnClickListener(clickListenerGrad); 

     bOdgovor3.setText(labels.get(2).option); 
     bOdgovor3.setTag(labels.get(2)); 
     bOdgovor3.setOnClickListener(clickListenerGrad); 

     bOdgovor4.setText(labels.get(3).option); 
     bOdgovor4.setTag(labels.get(3)); 
     bOdgovor4.setOnClickListener(clickListenerGrad); 

     score.setText("Score: " + brojacTacnihOdgovora); 

    }finally{ 
     mDbHelper.close(); 
    } 
} 

及部分我的适配器类的我使用这个类:

public Cursor getTestDataGradovi(long id){ 
    try{ 
     String sql ="SELECT * FROM tblGradovi WHERE _ID = " + id; 

     Cursor c = mDb.rawQuery(sql, null); 
     if (c!=null){ 
      c.moveToNext(); 
     } 
     return c; 
    }catch (SQLException mSQLException){ 
     Log.e(TAG, "getTestData >>"+ mSQLException.toString()); 
     throw mSQLException; 
    } 
} 

有人能告诉我在哪里问题?错误行(Kviz10Hard。)在这里:

labels.add(new Answer(c.getString(2), true)); 
+0

你的错误来自这里:光标c = mDbHelper.getTestDataGradovi(mCurrentID);检查c的值。我敢肯定它是空的 – 2013-05-07 10:46:27

+1

@AsierAranbarri'c'不会被'null',但是光标可能是空的。 – 2013-05-07 10:48:00

+0

ops,是的,我的坏! – 2013-05-07 10:48:45

回答

2

在尝试从Cursor对象获取任何数据之前,如果光标只包含一个值,则需要迭代结果或获取第一个数据。例如所有的结果之间的迭代,你应该做这样的事情:

String sql = "SELECT * FROM myTable"; 
Cursor cursor = mDbHelper.rawQuery(sql, null); 
if(cursor != null){ 
    if(cursor.getCount() > 0){ 
     for(cursor.move(0);cursor.moveToNext();cursor.isAfterLast()){ 
      // get your data here 
     } 
    } 
    cursor.close(); // close your cursor when you don't need it anymore 
} 

或另一种方式来做到这一点:

String sql = "SELECT * FROM myTable"; 
Cursor cursor = mDbHelper.rawQuery(sql, null); 
if(cursor != null){ 
    if(cursor.getCount() > 0){ 
     do { 
      // get value 
     } while(cursor.moveToNext()); 
    } 
    cursor.close(); // close your cursor when you don't need it anymore 
} 

,或者如果你是相当肯定的结果应该是只有一个对象这取决于你的SQL语句,你应该从你的Cursor访问这样的事之前调用cursor.moveToFirst();

String sql = "SELECT * FROM myTable"; 
Cursor cursor = mDbHelper.rawQuery(sql, null); 
if(cursor != null){ 
    cursor.moveToFirst(); 
    String myString = cursor.getString(cursor.getColumnIndex("title")); 
    cursor.close(); // close your cursor when you don't need it anymore 
} 

编辑:

如果你真的想在你的数据库类来创建这样的功能,我会做这样的事情:

public static Cursor getUserTitles(int userId){ 
     String sql = "SELECT * FROM myTable WHERE userId=?"; 
     return mDbHelper.rawQuery(sql, new String[]{Integer.toString(userId)}); 
} 

第二个编辑:

更改getTestDataGradovi到:

public Cursor getTestDataGradovi(long id){ 
    String sql ="SELECT * FROM tblGradovi WHERE _ID=?"; 
    return mDb.rawQuery(sql, new String[]{Integer.toString(id)}); 
} 

and add c.moveToFirst();,aft呃Cursor c = mDbHelper.getTestDataGradovi(mCurrentID);

+0

我已经导入sqlite数据库资产文件夹。每次我从数据库中获得一个随机行。 – marjanbaz 2013-05-07 11:04:27

+0

首先要确保如果您从资产导入整个数据库,那么只需使用上述方法从数据库获取数据,并且不会失败。 – hardartcore 2013-05-07 11:07:45

+0

你是什么意思“正确复制”?我猜如果它在我开始游戏时起作用,它会被复制到我的手机中。 – marjanbaz 2013-05-07 11:09:23

1

您不检查游标是否包含任何结果。你需要检查返回值c.moveToNext(),或检查c.getCount()或类似的东西。

+0

我不明白。我做c.moveToNext();在我的适配器类中并返回游标c。这不好吗? – marjanbaz 2013-05-07 11:02:11

+0

不,如果光标是空的,那不会对你有帮助! moveToNext正在返回'false',但是您不在任何地方检查。 – 2013-05-07 11:03:53

+0

那么,如何在我的代码中纠正这个问题?这东西不是我强大的西装,我很害怕。 :( – marjanbaz 2013-05-07 11:08:21