Android 更改视图时出现CursorIndexOutOfBounds错误
当我运行“我更改视图”时,我不断收到这些错误,它调用我的onResume方法来重新填充EditText字段。以下是我的简历代码:Android 更改视图时出现CursorIndexOutOfBounds错误,android,Android,当我运行“我更改视图”时,我不断收到这些错误,它调用我的onResume方法来重新填充EditText字段。以下是我的简历代码: 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.CursorIndexOutOfBoun
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
以下是我的setRowIdFromIntent方法:
protected void onResume(){
Log.v(tag, "In onResume!");
Cursor it = mDbHelper.fetchBook(mRowId);
super.onResume();
mDbHelper.open();
setRowIdFromIntent();
if (it.moveToFirst()) {
populateFields();
}
PopulateFields方法,该方法在活动暂停然后恢复时(例如当我从porttrait更改为横向时)从数据库检索信息
private void setRowIdFromIntent(){
if(mRowId == null){
Bundle extras = getIntent().getExtras();
mRowId = extras != null
? extras.getLong(DbAdapter.KEY_ROWID)
:null;
}
使用光标的moveToFirst()
方法。您的代码应该类似于:
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)));
还要确保您的查询返回您试图获取的列。我已经为此编写了一个ORM框架 您可以使用SQLite轻松编写Android应用程序。它使用Java类(在本例中可以创建
Book
class)作为数据库表(实体)
如果使用此框架,则根本看不到游标。您将看到的是:
if (cursor.moveToFirst()) {
\\ populate fields
} else {
\\ not found!
}
List books=Model.fetchAll(Book.class);
然后,您将拥有数据库中所有书籍的列表。您根本看不到列映射、数据库和表生成。对于您的情况非常有用。我唯一想做的就是,如果用户在编辑文本框中键入了文本,然后他们将视图更改为纵向,我不希望他们丢失已经键入的信息。这是最好的方法吗?我将填充字段更新为您所说的应该是现在我得到一个由光标it=line引起的nullPointerException错误。您弄错了,您应该使用“books”光标在populateFields方法中执行此操作。另外,如果您有兴趣保存活动的状态,参考这个问题,太棒了!这是可行的,但从我的代码来看,我认为将我的信息存储在一个捆绑包中并进行恢复可能比在onResume中进行填充更好?它似乎不那么贵。你怎么认为?
List<Book> books = Model.fetchAll(Book.class);