异常:-android.database.CursorIndexOutOfBoundsException:请求索引0,大小为0

创建警报通知,只是无法弄清为什么我一直遇到错误

android.database.CursorIndexOutOfBoundsException:已请求索引0,大小为0

失败(在计划课程alarm()部分中。

alarmManager.set(AlarmManager.RTC_WAKEUP,time,PendingIntent.getBroadcast(context,nextAlarmId,intentAlarm,PendingIntent.flaG_ONE_SHOT));

第一部分


private boolean createTestAlarm() {
        long now = DateUtil.todayLong();
        if (now <= DateUtil.getDateTimestamp(course.start)) {
            AlarmHandler.scheduleCourseAlarm(getapplicationContext(),courseId,DateUtil.getDateTimestamp(course.start),"Course starts today!",course.name + " begins on " + course.start);
        }

第二部分


public class AlarmHandler extends BroadcastReceiver {
    public static final String courseAlarmFile = "courseAlarms";
    public static final String assessmentAlarmFile = "assessmentAlarms";
    public static final String alarmFile = "alarmFile";
    public static final String nextAlarmField = "nextAlarmId";
    @Override
    public void onReceive(Context context,Intent intent) {
        String destination = intent.getStringExtra("destination");
        if (destination == null || destination.isEmpty()) {
            destination = "";
        }
        int id = intent.getIntExtra("id",0);
        String alarmTitle = intent.getStringExtra("title");
        String alarmText = intent.getStringExtra("text");
        int nextAlarmId = intent.getIntExtra("nextAlarmId",getandIncrementNextAlarmId(context));
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
                .setSmallIcon(R.drawable.ic_calendar_clock)
                .setContentTitle(alarmTitle)
                .setContentText(alarmText);
        Intent resultIntent;
        Uri uri;
        SharedPreferences sharedPreferences;
        switch (destination) {
            case "course":
                Course course = DatabaseControl.getcourse(context,id);
                if (course != null && course.notifications == 1) {
                    resultIntent = new Intent(context,CourseVieweractivity.class);
                    uri = Uri.parse(DatabaseData.COURSES_URI + "/" + id);
                    resultIntent.putExtra(DatabaseData.COURSE_CONTENT_TYPE,uri);
                }
                else {
                    return;
                }
                break;
            case "assessment":
                Assessment assessment = DatabaseControl.getassessment(context,id);
                if (assessment != null && assessment.notifications == 1) {
                    resultIntent = new Intent(context,AssessmentVieweractivity.class);
                    uri = Uri.parse(DatabaseData.ASSESSMENTS_URI + "/" + id);
                    resultIntent.putExtra(DatabaseData.ASSESSMENT_CONTENT_TYPE,uri);
                }
                else {
                    return;
                }
                break;
            default:
                resultIntent = new Intent(context,Mainactivity.class);
                break;
        }
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
        stackBuilder.addParentStack(Mainactivity.class);
        stackBuilder.addNextIntent(resultIntent);
        PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0,PendingIntent.flaG_UPDATE_CURRENT);
        builder.setContentIntent(resultPendingIntent).setautoCancel(true);
        Notificationmanager notificationmanager = (Notificationmanager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        notificationmanager.notify(nextAlarmId,builder.build());
    }
    public static boolean scheduleCourseAlarm(Context context,long id,long time,String title,String text) {
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        int nextAlarmId = getNextAlarmId(context);
        Intent intentAlarm = new Intent(context,AlarmHandler.class);
        intentAlarm.putExtra("id",id);
        intentAlarm.putExtra("title",title);
        intentAlarm.putExtra("text",text);
        intentAlarm.putExtra("destination","course");
        intentAlarm.putExtra("nextAlarmId",nextAlarmId);
        alarmManager.set(AlarmManager.RTC_WAKEUP,PendingIntent.flaG_ONE_SHOT));
        SharedPreferences sp = context.getSharedPreferences(courseAlarmFile,Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.putInt(Long.toString(id),nextAlarmId);
        editor.commit();
        incrementNextAlarmId(context);
        return true;
    }
    private static int getNextAlarmId(Context context) {
        SharedPreferences alarmPrefs;
        alarmPrefs = context.getSharedPreferences(alarmFile,Context.MODE_PRIVATE);
        int nextAlarmId = alarmPrefs.getInt(nextAlarmField,1);
        return nextAlarmId;
    }

    private static void incrementNextAlarmId(Context context) {
        SharedPreferences alarmPrefs;
        alarmPrefs = context.getSharedPreferences(alarmFile,1);
        SharedPreferences.Editor alarmEditor = alarmPrefs.edit();
        alarmEditor.putInt(nextAlarmField,nextAlarmId + 1);
        alarmEditor.commit();
    }
    private static int getandIncrementNextAlarmId(Context context) {
        int nextAlarmId = getNextAlarmId(context);
        incrementNextAlarmId(context);
        return nextAlarmId;
    }
}

第3部分-数据库代码

public static Course getcourse(Context context,long courseId) {
    Cursor cursor = context.getcontentResolver().query(DatabaseData.COURSES_URI,Database.COURSES_COLUMNS,Database.COURSES_TABLE_ID + " = " + courseId,null,null);
    cursor.moveToFirst();
    Long termId = cursor.getLong(cursor.getcolumnIndex(Database.COURSE_TERM_ID));
    String courseName = cursor.getString(cursor.getcolumnIndex(Database.COURSE_NAME));
    String courseDescription = cursor.getString(cursor.getcolumnIndex(Database.COURSE_DESCRIPTION));
    String courseStart = cursor.getString(cursor.getcolumnIndex(Database.COURSE_START));
    String courseEnd = cursor.getString(cursor.getcolumnIndex(Database.COURSE_END));
    String courseMentor = cursor.getString(cursor.getcolumnIndex(Database.COURSE_MENTOR));
    String courseMentorPhone = cursor.getString(cursor.getcolumnIndex(Database.COURSE_MENTOR_PHONE));
    String courseMentorEmail = cursor.getString(cursor.getcolumnIndex(Database.COURSE_MENTOR_EMAIL));
    String courseNote = cursor.getString(cursor.getcolumnIndex(Database.COURSE_NOTE));
    int courseNotifications = (cursor.getInt(cursor.getcolumnIndex(Database.COURSE_NOTIFICATIONS)));

    Course c = new Course();
    c.courseId = courseId;
    c.termId = termId;
    c.name = courseName;
    c.description = courseDescription;
    c.start = courseStart;
    c.end = courseEnd;
    c.mentor = courseMentor;
    c.mentorPhone = courseMentorPhone;
    c.mentorEmail = courseMentorEmail;
    c.note = courseNote;
    c.notifications = courseNotifications;
    return c;
}
lkj123lkj123lkj 回答:异常:-android.database.CursorIndexOutOfBoundsException:请求索引0,大小为0

确保错误消息显示:

  

android.database.CursorIndexOutOfBoundsException:已请求索引0,大小为0

所以这意味着:

CursorIndexOutOfBoundsException将光标视为一个集合,您越界了

Index 0 requested您想访问集合中的位置0

with a size of 0,但是集合大小为0(空),因此超出范围。

如果您期望数据库架构正确,则不应使用getColumnIndex,而应使用getColumnIndexOrThrow https://developer.android.com/reference/android/database/Cursor#getColumnIndexOrThrow(java.lang.String),那样您将快速失败并查看数据的哪些部分不正确。

但是是的,基本上您的光标为空,请检查您正在执行的查询。您还可以在游标上设置断点,并尝试在内容解析器上进行其他查询。


您还可以使用Stetho之类的工具来检查您的设备数据库,以查看其是否包含任何数据(并进行一些查询)

http://facebook.github.io/stetho/


或者完全远离光标,并使用推荐的较新的推荐数据库访问库(如Room):

https://developer.android.com/topic/libraries/architecture/room

本文链接:https://www.f2er.com/3168655.html

大家都在问