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

时间:2017-01-15 20:01:37

标签: android sqlite android-sqlite

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

2 个答案:

答案 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,但这样效率较低

相关问题