Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 更改视图时出现CursorIndexOutOfBounds错误_Android - Fatal编程技术网

Android 更改视图时出现CursorIndexOutOfBounds错误

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

当我运行“我更改视图”时,我不断收到这些错误,它调用我的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.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);