Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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.database.CursorIndexOutOfBoundsException:请求索引-1,大小为0_Android_Sqlite_Android Sqlite - Fatal编程技术网

原因:android.database.CursorIndexOutOfBoundsException:请求索引-1,大小为0

原因: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

我有一个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


您的代码可能存在两个问题

一种是新创建的光标位于任何行之前(位置-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();
    }