更改视图时出现CursorIndexOutOfBounds错误

时间:2011-07-05 23:27:47

标签: android

07-05 23:23:27.497: ERROR/AndroidRuntime(390): java.lang.RuntimeException: Unable to resume activity {com.fttech.books/com.fttech.books.creatBook}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

07-05 23:23:27.497: ERROR/AndroidRuntime(390): Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

当我运行更改视图时,我不断收到这些错误,并调用我的onResume方法重新填充EditText字段。这是我的简历代码:

protected void onResume(){
    Log.v(tag, "In onResume!");
    Cursor it = mDbHelper.fetchBook(mRowId);
    super.onResume();
    mDbHelper.open();
    setRowIdFromIntent();
    if (it.moveToFirst()) {
       populateFields();


    }

这是我的setRowIdFromIntent方法:

private void setRowIdFromIntent(){
    if(mRowId == null){
        Bundle extras = getIntent().getExtras();
        mRowId = extras != null 
        ? extras.getLong(DbAdapter.KEY_ROWID)
                :null;
    }

PopulateFields方法,如果活动暂停然后恢复,则从数据库中检索信息,例如当我从porttrait更改为横向时。

private void populateFields() {
    if(mRowId != null){
        Cursor books = mDbHelper.fetchBook(mRowId);
        startManagingCursor(books);

        bookTitle.setText(books.getString(books.getColumnIndexOrThrow(DbAdapter.KEY_BOOK)));
        bookAuthor.setText(books.getString(books.getColumnIndexOrThrow(DbAdapter.KEY_AUTHOR)));
        bookIsbn.setText(books.getString(books.getColumnIndexOrThrow(DbAdapter.KEY_ISBN)));
        ratingBar.setRating(books.getFloat(books.getColumnIndex(DbAdapter.KEY_RATING)));

2 个答案:

答案 0 :(得分:0)

使用光标的moveToFirst()方法。你的代码应该是这样的:

if (cursor.moveToFirst()) {
    \\ populate fields
} else {
    \\ not found!
}

还要确保您的查询返回您尝试获取的列。

答案 1 :(得分:-1)

我为此编写了一个ORM框架。 https://github.com/ahmetalpbalkan/orman

您可以使用SQLite轻松编写Android应用程序。它使用您的Java类(在本例中可以创建Book类)作为数据库表(实体)。

如果使用此框架,则根本不会看到游标。所有你会看到的将是:

List<Book> books = Model.fetchAll(Book.class);

然后您将拥有数据库中所有书籍的列表。您根本不会看到列映射,数据库和表生成。在你的情况下非常有用。