Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.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-游标异常-请求索引1,大小为1_Android_Sqlite_Cursor_Android Cursor - Fatal编程技术网

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