Android.database.CursorIndexOutOfBoundsException:指数0要求,以0-S的尺寸 [英] Android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 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屋!