我有一个SQLite数据库。这是下表。它正在被添加。
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
答案 0 :(得分: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()检查计数): -
while (d.moveToNext()) {
newcamid=d.getString(0);
Toast.makeText(getApplicationContext(),"Newcampid :"+newcamid,LENGTH_LONG).show();
}
如果没有行, moveToNext
将有效地返回false,如果在BEFORE位置将移动到第一行,任何后续迭代将移动到下一条记录,当没有更多行到期时结束while循环对有效的虚假提出。
答案 1 :(得分:0)
我使用这种方法:
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();
}
Android.database.cursorindexoutofboundsexception异常发生在d.getString(0);
这行代码,需要添加if(d.moveToFirst()){}这个判断
"SELECT * FROM Allcampaigndata WHERE allcampaid =?"
中的db.rawQuery(sqleight, null)
参数指定要返回列信息,如果返回所有列,则返回null,但这样效率较低