Android.database.CursorIndexOutOfBoundsException:指数0要求,以0-S的尺寸 [英] Android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0-s

查看:203
本文介绍了Android.database.CursorIndexOutOfBoundsException:指数0要求,以0-S的尺寸的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在使用SQLite数据库得到这个错误。

  07-16 17:45:13.106:E / AndroidRuntime(7703):产生的原因:
android.database.CursorIndexOutOfBoundsException:指数0要求,为0的大小
 

我使用的SQLite数据库来存储本书在它的对象。

 公共类MySQLiteHelper扩展SQLiteOpenHelper {

    //数据库版本
    私有静态最终诠释DATABASE_VERSION = 1;
    //数据库名称
    私有静态最后弦乐DATABASE_NAME =BookDB;

    公共MySQLiteHelper(上下文的背景下){
        超(背景下,DATABASE_NAME,空,DATABASE_VERSION);
    }

    @覆盖
    公共无效的onCreate(SQLiteDatabase DB){
        // SQL语句创建图书表
        字符串CREATE_BOOK_TABLE =CREATE TABLE书(+
                ID INTEGER PRIMARY KEY AUTOINCREMENT,+
                标题文本,+
                作家文本);

        //创建books表
        db.execSQL(CREATE_BOOK_TABLE);
    }

    @覆盖
    公共无效onUpgrade(SQLiteDatabase分贝,INT oldVersion,诠释静态网页){
        如果存在//删除旧的书表
        db.execSQL(DROP TABLE IF EXISTS书);

        //创建新的书籍表
        this.onCreate(DB);
    }
    // ------------------------------------------------ ---------------------

    / **
     * CRUD操作(创建添加,读得,更新,删除)书+获得所有书+删除所有的书
     * /

    //书表名
    私有静态最后弦乐TABLE_BOOKS =书;

    //书表列名
    私有静态最后弦乐KEY_ID =ID;
    私有静态最后弦乐KEY_TITLE =称号;
    私有静态最后弦乐KEY_AUTHOR =作者;

    私有静态最后的String []柱= {KEY_ID,KEY_TITLE,KEY_AUTHOR};

    公共无效addBook(书书){
        Log.d(addBook,book.toString());
        // 1.使用参考写入数据库
        SQLiteDatabase DB = this.getWritableDatabase();

        // 2.创建ContentValues​​添加键列/值
        ContentValues​​值=新ContentValues​​();
        values​​.put(KEY_TITLE,book.getTitle()); //获得冠军
        values​​.put(KEY_AUTHOR,book.getAuthor()); //获取作者

        // 3.插入
        db.insert(TABLE_BOOKS,//表
                空,// nullColumnHack
                值); //键/值 - >键=列名/值=列值

        // 4.关闭
        db.close();
    }

    公共图书getBook(INT ID){

        // 1.使用参考读取数据库
        SQLiteDatabase DB = this.getReadableDatabase();

        // 2.构建查询
        光标光标=
                db.query(TABLE_BOOKS,//一个表
                柱,// B。列名
                ID =?,// C。选
                新的String [] {将String.valueOf(ID)} //Ð。选择ARGS
                空,//即通过...分组
                空,// F。有
                空,//克为了通过
                空值); // H。限制

        // 3。如果我们得到的结果获取第一个
        如果(光标!= NULL)
            cursor.moveToFirst();

        // 4.构建簿对象
        书书=新的图书();
        book.setId(的Integer.parseInt(cursor.getString(0)));
        book.setTitle(cursor.getString(1));
        book.setAuthor(cursor.getString(2));

        Log.d(getBook(+ ID +),book.toString());

        // 5.归还书
        返回书;
    }

    //获取所有书籍
    公开名单<图书> getAllBooks(){
        名单<图书>书=新的LinkedList<图书>();

        // 1.构建查询
        查询字符串=SELECT * FROM+ TABLE_BOOKS;

        // 2.获取参考写入数据库
        SQLiteDatabase DB = this.getWritableDatabase();
        光标光标= db.rawQuery(查询,NULL);

        // 3。去了每一行,建书并将其添加到列表
        书书= NULL;
        如果(cursor.moveToFirst()){
            做 {
                本书=新的图书();
                book.setId(的Integer.parseInt(cursor.getString(0)));
                book.setTitle(cursor.getString(1));
                book.setAuthor(cursor.getString(2));

                //加入书书
                books.add(书);
            }而(cursor.moveToNext());
        }

        Log.d(getAllBooks(),books.toString());

        //还书
        还书;
    }

     //更新单本图书
    公众诠释updateBook(书书){

        // 1.使用参考写入数据库
        SQLiteDatabase DB = this.getWritableDatabase();

        // 2.创建ContentValues​​添加键列/值
        ContentValues​​值=新ContentValues​​();
        values​​.put(标题,book.getTitle()); //获得冠军
        values​​.put(作家,book.getAuthor()); //获取作者

        // 3.更新行
        INT I = db.update(TABLE_BOOKS,//表
                值,//列/值
                KEY_ID +=?,//选
                新的String [] {将String.valueOf(book.getId())}); //选择ARGS

        // 4.关闭
        db.close();

        返回我;

    }

    //删除一本书
    公共无效deleteBook(书书){

        // 1.使用参考写入数据库
        SQLiteDatabase DB = this.getWritableDatabase();

        // 2.删除
        db.delete(TABLE_BOOKS,
                KEY_ID +=?,
                新的String [] {将String.valueOf(book.getId())});

        // 3。关闭
        db.close();

        Log.d(deleteBook,book.toString());

    }
}
 

解决方案

您必须检查,如果你的光标有任何线路。像这样的:

  // 3。如果我们得到的结果获取第一个
    如果(cursor.moveToFirst()){
       //做的工作
}
 

如果指针不为空,否则为false

cursor.moveToFirst()返回true。

您正试图从你的光标阅读时,它是空的,因此异常

编辑:这是你的 getBook(0),呼叫 getBook(1)相反,第一汽车-incremented值id为1,不为0而改变光标支票EX pression。

I got this Error while using SQLite DATABASE.

07-16 17:45:13.106: E/AndroidRuntime(7703): Caused by: 
android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

I'm Using SQLite Database to Store Book Objects in it.

public class MySQLiteHelper extends SQLiteOpenHelper {

    // Database Version
    private static final int DATABASE_VERSION = 1;
    // Database Name
    private static final String DATABASE_NAME = "BookDB";

    public MySQLiteHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // SQL statement to create book table
        String CREATE_BOOK_TABLE = "CREATE TABLE books ( " +
                "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                "title TEXT, "+
                "author TEXT )";

        // create books table
        db.execSQL(CREATE_BOOK_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older books table if existed
        db.execSQL("DROP TABLE IF EXISTS books");

        // create fresh books table
        this.onCreate(db);
    }
    //---------------------------------------------------------------------

    /**
     * CRUD operations (create "add", read "get", update, delete) book + get all books + delete all books
     */

    // Books table name
    private static final String TABLE_BOOKS = "books";

    // Books Table Columns names
    private static final String KEY_ID = "id";
    private static final String KEY_TITLE = "title";
    private static final String KEY_AUTHOR = "author";

    private static final String[] COLUMNS = {KEY_ID,KEY_TITLE,KEY_AUTHOR};

    public void addBook(Book book){
        Log.d("addBook", book.toString());
        // 1. get reference to writable DB
        SQLiteDatabase db = this.getWritableDatabase();

        // 2. create ContentValues to add key "column"/value
        ContentValues values = new ContentValues();
        values.put(KEY_TITLE, book.getTitle()); // get title
        values.put(KEY_AUTHOR, book.getAuthor()); // get author

        // 3. insert
        db.insert(TABLE_BOOKS, // table
                null, //nullColumnHack
                values); // key/value -> keys = column names/ values = column values

        // 4. close
        db.close();
    }

    public Book getBook(int id){

        // 1. get reference to readable DB
        SQLiteDatabase db = this.getReadableDatabase();

        // 2. build query
        Cursor cursor =
                db.query(TABLE_BOOKS, // a. table
                COLUMNS, // b. column names
                " id = ?", // c. selections
                new String[] { String.valueOf(id) }, // d. selections args
                null, // e. group by
                null, // f. having
                null, // g. order by
                null); // h. limit

        // 3. if we got results get the first one
        if (cursor != null)
            cursor.moveToFirst();

        // 4. build book object
        Book book = new Book();
        book.setId(Integer.parseInt(cursor.getString(0)));
        book.setTitle(cursor.getString(1));
        book.setAuthor(cursor.getString(2));

        Log.d("getBook("+id+")", book.toString());

        // 5. return book
        return book;
    }

    // Get All Books
    public List<Book> getAllBooks() {
        List<Book> books = new LinkedList<Book>();

        // 1. build the query
        String query = "SELECT  * FROM " + TABLE_BOOKS;

        // 2. get reference to writable DB
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(query, null);

        // 3. go over each row, build book and add it to list
        Book book = null;
        if (cursor.moveToFirst()) {
            do {
                book = new Book();
                book.setId(Integer.parseInt(cursor.getString(0)));
                book.setTitle(cursor.getString(1));
                book.setAuthor(cursor.getString(2));

                // Add book to books
                books.add(book);
            } while (cursor.moveToNext());
        }

        Log.d("getAllBooks()", books.toString());

        // return books
        return books;
    }

     // Updating single book
    public int updateBook(Book book) {

        // 1. get reference to writable DB
        SQLiteDatabase db = this.getWritableDatabase();

        // 2. create ContentValues to add key "column"/value
        ContentValues values = new ContentValues();
        values.put("title", book.getTitle()); // get title
        values.put("author", book.getAuthor()); // get author

        // 3. updating row
        int i = db.update(TABLE_BOOKS, //table
                values, // column/value
                KEY_ID+" = ?", // selections
                new String[] { String.valueOf(book.getId()) }); //selection args

        // 4. close
        db.close();

        return i;

    }

    // Deleting single book
    public void deleteBook(Book book) {

        // 1. get reference to writable DB
        SQLiteDatabase db = this.getWritableDatabase();

        // 2. delete
        db.delete(TABLE_BOOKS,
                KEY_ID+" = ?",
                new String[] { String.valueOf(book.getId()) });

        // 3. close
        db.close();

        Log.d("deleteBook", book.toString());

    }
}

解决方案

You have to check if your Cursor has any line. Like this:

// 3. if we got results get the first one
    if (cursor.moveToFirst()){
       // do the work
}

cursor.moveToFirst() returns true if cursor is not empty, false otherwise.

You were trying to read from your Cursor when it was empty, hence the Exception.

EDIT: It is at your getBook(0), call getBook(1) instead, the first auto-incremented id value is 1, not 0. And change the Cursor check expression.

这篇关于Android.database.CursorIndexOutOfBoundsException:指数0要求,以0-S的尺寸的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆