原因:android.database.CursorIndexOutOfBoundsException:请求索引-1,大小为0
我有一个SQLite数据库。这是下表。它正在增加原因:android.database.CursorIndexOutOfBoundsException:请求索引-1,大小为0,android,sqlite,android-sqlite,Android,Sqlite,Android Sqlite,我有一个SQLite数据库。这是下表。它正在增加 public boolean addAllCampaign(Allcampaigndata allcampaigndata) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(ALLCAMP_ID, allcampaigndata.getAllCam
public boolean addAllCampaign(Allcampaigndata allcampaigndata) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(ALLCAMP_ID, allcampaigndata.getAllCampid());
contentValues.put(ALLCAMP_NAME, allcampaigndata.getAllCampName());
contentValues.put(ALLVIEWS, allcampaigndata.getAllViews());
contentValues.put(ALLDESTROY, allcampaigndata.getAllDestroy());
contentValues.put(ALLENDOFCAMP,allcampaigndata.getAllEndofcamp());
db.insert(TABLE_NAME_EIGHT, null, contentValues);
db.close();
return true;
}
现在我有一个方法,它有一个查询:
public Cursor getoneCampaign(int allcampaignid) {
SQLiteDatabase db = this.getReadableDatabase();
String sqleight = "SELECT * FROM Allcampaigndata WHERE allcampaid =?";
Cursor d= db.rawQuery(sqleight, null);
return d;
}
我从这里调用此方法:
private void shownextcamp(int allcampaignid){
Cursor d =db.getoneCampaign(allcampaignid);
newcamid=d.getString(0);
Toast.makeText(getApplicationContext(),"Newcampid :"+newcamid,LENGTH_LONG).show();
d.moveToFirst();
}
我得到下面的错误。只是不知道为什么:
原因:android.database.CursorIndexOutOfBoundsException:索引-1
已请求,大小为0
您的代码可能存在两个问题 一种是新创建的光标位于任何行之前(位置-1)。因此,如果不将光标移动到某一行,您将尝试访问一个不存在的行。第二个问题是,如果查询没有返回行,那么也不会返回行。第一个是错误的原因(索引-1的大小为0) 您可以编写以下代码:-
private void shownextcamp(int allcampaignid){
Cursor d =db.getoneCampaign(allcampaignid);
if (d.getCount > 0) {
d.moveToFirst();
newcamid=d.getString(0);
Toast.makeText(getApplicationContext(),"Newcampid :"+newcamid,LENGTH_LONG).show();
} else {
//handle no row
}
}
这a)检查是否有行,如果有b)移动到第一行(克服这两个问题)
或者,如果需要一行或多行,则使用替换上面的if构造(请注意,此构造中不处理0行,但可以添加通过d.getCount()检查计数):-
如果没有行,moveToNext
将有效返回false,如果在BEFORE位置将移动到第一行,则任何后续迭代将移动到下一条记录,当由于有效的false而没有更多行时,完成while循环。我使用此方法:
private void shownextcamp(int allcampaignid){
Cursor d =db.getoneCampaign(allcampaignid);
if (null == d) {
return;//return 0;
}
while (d.moveToNext()){
for (int i = 0;i < d.getColumnCount();i++){
String columnName = d.getColumnName(i);
Toast.makeText(mContext.getApplicationContext()
,columnName+"(Newcampid) :"+d.getString(d.getColumnIndex(columnName))
,Toast.LENGTH_SHORT).show();
}
}
d.close();
}
private void shownextcap(int-allcampaid){
游标d=db.getoneCampaign(allcampaignid);
if(null==d){
return;//返回0;
}
而(d.moveToNext()){
对于(int i=0;i
d.getString(0)中出现Android.database.cursorindexoutofboundsexception异常
这行代码,需要添加if(d.moveToFirst()){}这个判断
db.rawQuery(sqleight,null)
中的参数“SELECT*FROM allcampdata WHERE allcampaid=?”
指定返回列信息,如果返回所有列,则为null,但效率较低哪一行是获得错误的行?这一行是Lajos newcamid=d.getString(0);您没有将光标移动到第一行。因此,您仍然指向第1行。@Rotwang我的sqlite查询是select*from where campaid=something..因此我认为它将只包含一条记录…但是如果您从未将光标设置在第一条(仅在您的情况下)记录上,则光标将保持在任何记录之前。这导致<代码>索引-1已请求。
private void shownextcamp(int allcampaignid){
Cursor d =db.getoneCampaign(allcampaignid);
if (null == d) {
return;//return 0;
}
while (d.moveToNext()){
for (int i = 0;i < d.getColumnCount();i++){
String columnName = d.getColumnName(i);
Toast.makeText(mContext.getApplicationContext()
,columnName+"(Newcampid) :"+d.getString(d.getColumnIndex(columnName))
,Toast.LENGTH_SHORT).show();
}
}
d.close();
}