Android-游标异常-请求索引1,大小为1
我有以下代码:Android-游标异常-请求索引1,大小为1,android,sqlite,cursor,android-cursor,Android,Sqlite,Cursor,Android Cursor,我有以下代码: private Cursor query(String selection, String[] selectionArgs, String[] columns, String tableName) { /* * The SQLiteBuilder provides a map for all possible columns requested * to actual columns in the database, creating
private Cursor query(String selection, String[] selectionArgs,
String[] columns, String tableName) {
/*
* The SQLiteBuilder provides a map for all possible columns requested
* to actual columns in the database, creating a simple column alias
* mechanism by which the ContentProvider does not need to know the real
* column names
*/
SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
builder.setTables(tableName);
Cursor cursor = builder.query(mDatabase, columns, selection,
selectionArgs, null, null, null);
if (cursor == null) {
return null;
} else if (!cursor.moveToFirst()) {
cursor.close();
return null;
}
return cursor;
}
public List<VEvent> getVEvents(int week, int year) {
String selection = KEY_WEEK + "=? AND " + KEY_YEAR + "=?";
String[] selectionArgs = new String[] { String.valueOf(week), String.valueOf(year) };
Cursor cursor = query(selection, selectionArgs, ALL_CALENDAR_COLUMNS, CALENDAR_TABLE_NAME);
List<VEvent> events = new ArrayList<VEvent>();
while (cursor != null) {
VEvent e = new VEvent();
try {
e.getProperties().add(new Uid(cursor.getString(1)));
e.getProperties().add(new DtStamp(cursor.getString(2)));
e.getProperties().add(new Organizer(cursor.getString(3)));
e.getProperties().add(new DtStart(cursor.getString(4)));
e.getProperties().add(new DtEnd(cursor.getString(5)));
e.getProperties().add(new Summary(cursor.getString(6)));
e.getProperties().add(new Location(cursor.getString(7)));
e.getProperties().add(new Description(cursor.getString(8)));
events.add(e);
} catch (ParseException ex) {
Log.v("getvevents", "parse exception : " + ex.getLocalizedMessage());
} catch (URISyntaxException ex) {
Log.v("getvevents", "uri exception : " + ex.getLocalizedMessage());
}
cursor.moveToNext();
}
return events;
}
第177行对应于
e.getProperties().add(new Uid(cursor.getString(1)));
在query方法和getVEvents中,我总是检查游标是否为null,并且我使用moveToFirst()和moveToNext(),因此我不太清楚为什么会发生异常,以及“index 1 requested with a size为1”的确切含义
非常感谢 该错误表示您请求了索引为1的项目,但您的请求发送到的列表的大小仅为1,这意味着它只包含一个项目,最大索引为0
您的查询似乎只返回一行游标。该错误意味着您请求了索引为1的项目,但您的请求发送到的列表大小仅为1,这意味着它只包含一个项目,最大索引为0 您的查询似乎只返回一行游标。试试下面的代码
private Cursor query(String selection, String[] selectionArgs,
String[] columns, String tableName) {
/*
* The SQLiteBuilder provides a map for all possible columns requested
* to actual columns in the database, creating a simple column alias
* mechanism by which the ContentProvider does not need to know the real
* column names
*/
SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
builder.setTables(tableName);
Cursor cursor = builder.query(mDatabase, columns, selection,
selectionArgs, null, null, null);
return cursor;
}
public List<VEvent> getVEvents(int week, int year) {
String selection = KEY_WEEK + "=? AND " + KEY_YEAR + "=?";
String[] selectionArgs = new String[] { String.valueOf(week), String.valueOf(year) };
Cursor cursor = query(selection, selectionArgs, ALL_CALENDAR_COLUMNS, CALENDAR_TABLE_NAME);
List<VEvent> events = new ArrayList<VEvent>();
while (cursor.moveToNext()) {
VEvent e = new VEvent();
try {
e.getProperties().add(new Uid(cursor.getString(1)));
e.getProperties().add(new DtStamp(cursor.getString(2)));
e.getProperties().add(new Organizer(cursor.getString(3)));
e.getProperties().add(new DtStart(cursor.getString(4)));
e.getProperties().add(new DtEnd(cursor.getString(5)));
e.getProperties().add(new Summary(cursor.getString(6)));
e.getProperties().add(new Location(cursor.getString(7)));
e.getProperties().add(new Description(cursor.getString(8)));
events.add(e);
} catch (ParseException ex) {
Log.v("getvevents", "parse exception : " + ex.getLocalizedMessage());
} catch (URISyntaxException ex) {
Log.v("getvevents", "uri exception : " + ex.getLocalizedMessage());
}
}
return events;
}
private Cursor查询(字符串选择,字符串[]selectionArgs,
字符串[]列,字符串表名){
/*
*SQLiteBuilder为请求的所有可能列提供映射
*到数据库中的实际列,创建一个简单的列别名
*ContentProvider不需要知道真实内容的机制
*列名
*/
SQLiteQueryBuilder=新SQLiteQueryBuilder();
builder.setTables(tableName);
Cursor=builder.query(mDatabase、columns、selection、,
selectionArgs,null,null,null);
返回光标;
}
公共列表getVEvents(整数周,整数年){
字符串选择=关键字周+“=”和“+关键字年+”=?”;
String[]selectionArgs=newstring[]{String.valueOf(week),String.valueOf(year)};
游标=查询(选择、选择、所有日历列、日历表名称);
列表事件=新建ArrayList();
while(cursor.moveToNext()){
VEvent e=新VEvent();
试一试{
e、 getProperties().add(新Uid(cursor.getString(1)));
e、 getProperties().add(新的DtStamp(cursor.getString(2));
e、 getProperties().add(新的管理器(cursor.getString(3));
e、 getProperties().add(新的DtStart(cursor.getString(4));
e、 getProperties().add(新的DtEnd(cursor.getString(5));
e、 getProperties().add(新的摘要(cursor.getString(6));
e、 getProperties().add(新位置(cursor.getString(7));
e、 getProperties().add(新的描述(cursor.getString(8));
添加(e);
}捕获(解析异常){
Log.v(“getvevents”,“解析异常:”+ex.getLocalizedMessage());
}捕获(URISyntaxException-ex){
Log.v(“getvevents”,“uri异常:”+ex.getLocalizedMessage());
}
}
返回事件;
}
试试这段代码
private Cursor query(String selection, String[] selectionArgs,
String[] columns, String tableName) {
/*
* The SQLiteBuilder provides a map for all possible columns requested
* to actual columns in the database, creating a simple column alias
* mechanism by which the ContentProvider does not need to know the real
* column names
*/
SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
builder.setTables(tableName);
Cursor cursor = builder.query(mDatabase, columns, selection,
selectionArgs, null, null, null);
return cursor;
}
public List<VEvent> getVEvents(int week, int year) {
String selection = KEY_WEEK + "=? AND " + KEY_YEAR + "=?";
String[] selectionArgs = new String[] { String.valueOf(week), String.valueOf(year) };
Cursor cursor = query(selection, selectionArgs, ALL_CALENDAR_COLUMNS, CALENDAR_TABLE_NAME);
List<VEvent> events = new ArrayList<VEvent>();
while (cursor.moveToNext()) {
VEvent e = new VEvent();
try {
e.getProperties().add(new Uid(cursor.getString(1)));
e.getProperties().add(new DtStamp(cursor.getString(2)));
e.getProperties().add(new Organizer(cursor.getString(3)));
e.getProperties().add(new DtStart(cursor.getString(4)));
e.getProperties().add(new DtEnd(cursor.getString(5)));
e.getProperties().add(new Summary(cursor.getString(6)));
e.getProperties().add(new Location(cursor.getString(7)));
e.getProperties().add(new Description(cursor.getString(8)));
events.add(e);
} catch (ParseException ex) {
Log.v("getvevents", "parse exception : " + ex.getLocalizedMessage());
} catch (URISyntaxException ex) {
Log.v("getvevents", "uri exception : " + ex.getLocalizedMessage());
}
}
return events;
}
private Cursor查询(字符串选择,字符串[]selectionArgs,
字符串[]列,字符串表名){
/*
*SQLiteBuilder为请求的所有可能列提供映射
*到数据库中的实际列,创建一个简单的列别名
*ContentProvider不需要知道真实内容的机制
*列名
*/
SQLiteQueryBuilder=新SQLiteQueryBuilder();
builder.setTables(tableName);
Cursor=builder.query(mDatabase、columns、selection、,
selectionArgs,null,null,null);
返回光标;
}
公共列表getVEvents(整数周,整数年){
字符串选择=关键字周+“=”和“+关键字年+”=?”;
String[]selectionArgs=newstring[]{String.valueOf(week),String.valueOf(year)};
游标=查询(选择、选择、所有日历列、日历表名称);
列表事件=新建ArrayList();
while(cursor.moveToNext()){
VEvent e=新VEvent();
试一试{
e、 getProperties().add(新Uid(cursor.getString(1)));
e、 getProperties().add(新的DtStamp(cursor.getString(2));
e、 getProperties().add(新的管理器(cursor.getString(3));
e、 getProperties().add(新的DtStart(cursor.getString(4));
e、 getProperties().add(新的DtEnd(cursor.getString(5));
e、 getProperties().add(新的摘要(cursor.getString(6));
e、 getProperties().add(新位置(cursor.getString(7));
e、 getProperties().add(新的描述(cursor.getString(8));
添加(e);
}捕获(解析异常){
Log.v(“getvevents”,“解析异常:”+ex.getLocalizedMessage());
}捕获(URISyntaxException-ex){
Log.v(“getvevents”,“uri异常:”+ex.getLocalizedMessage());
}
}
返回事件;
}
它的意思正是它所说的。当大小仅为1时,您尝试访问元素1(第二个,因为它是基于零的)
检测数据集结尾的方式有问题。处理完最后一行后,您的光标不会神奇地变为null
。相反,它保持相同的值,但其内部状态发生变化
您需要以不同的方式检测数据集的结尾
例如,您可以使用:
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
blah blah blah
cursor.moveToNext();
}
它的意思正是它所说的。当大小仅为1时,您尝试访问元素1(第二个,因为它是基于零的)
检测数据集结尾的方式有问题。处理完最后一行后,您的光标不会神奇地变为null
。相反,它保持相同的值,但其内部状态发生变化
您需要以不同的方式检测数据集的结尾
例如,您可以使用:
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
blah blah blah
cursor.moveToNext();
}
尝试moveToFirst()和getString(0