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)));
答案 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);
然后您将拥有数据库中所有书籍的列表。您根本不会看到列映射,数据库和表生成。在你的情况下非常有用。