0

我让应用程序和编译器显示错误。我不知道发生了什么。我想在点击后从数据库中检索并显示随机记录。我使用了来自Android SQLite 数据库教程和 stackoverflov 错误的教程:

    10-30 19:19:59.533: E/AndroidRuntime(359): FATAL EXCEPTION: main
10-30 19:19:59.533: E/AndroidRuntime(359): android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
10-30 19:19:59.533: E/AndroidRuntime(359):  at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)

我的代码是:

public class PrzyslowiaArabskie  {

    private static final String TABLE_NAME = "tabela_przyslowia";
    private static final String DATABASE_NAME = "przyslowiadb";
    private static final int DATABASE_VERSION = 1;
    public static final String KEY_ID = "id";
    public static final String KEY_PRZYSLOWIE = "przyslowie";

    private DbHelper myHelper;
    private final Context myContext;
    private SQLiteDatabase myDatabase;




    private static class DbHelper extends SQLiteOpenHelper {

        public DbHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
            // TODO Auto-generated constructor stub
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
             db.execSQL("CREATE TABLE " + TABLE_NAME + " (" + 
                       KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
                     KEY_PRZYSLOWIE + " TEXT NOT NULL);" );


        } 

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub
            db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
            onCreate(db);
        }

    }
    public PrzyslowiaArabskie(Context c) {
        myContext = c;
    }
    public PrzyslowiaArabskie open() {
        myHelper = new DbHelper(myContext);
        myDatabase = myHelper.getWritableDatabase();
        return this;
    }
    public void close() {
        myHelper.close();
    }


    public String getData() {
        // TODO Auto-generated method stub
        String[] columns = new String[] { KEY_ID, KEY_PRZYSLOWIE };
        Cursor c = myDatabase.query(TABLE_NAME, columns, KEY_ID + "=?", new String[] {String.valueOf(KEY_ID + 1)}, null, null, null);
         if (c != null) {
             c.moveToFirst(); 
             String data = c.getString(1);
             return data;
         }  
        return null;
    }


}

我究竟做错了什么?

我解决了我的问题。我制作了 3 个按钮(下一个记录、上一个记录和显示记录),而不是从数据库中获取随机记录。我使用此说明从数据库中获取下一条记录 感谢您的帮助。

4

4 回答 4

2

光标将始终不为空。相反moveToFirst有时会失败。

尝试

if(c.moveToFirst() {
  String data = c.getString(c.getColumnIndexOrThrow(KEY_PRZYSLOWIE ));
}
于 2012-10-30T19:37:08.317 回答
2

您正在尝试对不存在的游标行上的列进行索引。

if (c != null) {
     c.moveToFirst(); // This needs to check for validity
     String data = c.getString(1); // Before indexing into a non-existent record
     return data;
}

反而...

if(c.moveToFirst()){
  String data = c.getString(1);
  return data;
}

当然,如果您打算遍历多行,您可能需要考虑使用 while 循环并使用while(c.moveToNext()) ...

编辑:地址评论的扩展答案。

要使用 while 循环遍历游标中可用的所有记录并利用消费者代码中的数据,您可能必须更改方法签名以返回排序集合而不是单个字符串。

public ArrayList<String> getData() {
    ArrayList<String> data = new ArrayList<String>();
    String[] columns = new String[] { KEY_ID, KEY_PRZYSLOWIE };
    Cursor c = myDatabase.query(TABLE_NAME, columns, KEY_ID + "=?", new String[] {String.valueOf(KEY_ID + 1)}, null, null, null);
    while(null != c && c.moveToNext()) {
      data.add(c.getString(1));
    }
    return data;
}

提供的示例代码应该可以得到您想要的结果,但是如果您需要更多关于处理对象集合和 while 循环的说明,我建议您查阅Java 文档以获取有关处理数据结构的一些信息或更抽象的编程信息和控制流。

于 2012-10-30T19:39:09.440 回答
0

改变

if (c != null) {

if (c != null && c.moveToFirst()) {

否则,即使没有匹配的行,您也会尝试从游标中获取数据。

于 2012-10-30T19:39:59.640 回答
0

看起来你有一个空光标。而不是检查它是否为空尝试检查

if(mCursor.getCount > 0)
{
  //do stuff
}
于 2012-10-30T19:45:11.840 回答