首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >异常:-请求android.database.CursorIndexOutOfBoundsException:索引0,大小为0

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

Stack Overflow用户
提问于 2019-11-04 06:46:17
回答 1查看 107关注 0票数 0

创建警报通知,只是不知道为什么我总是遇到

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

这是失败的(在时间表课程警报()部分)。

代码语言:javascript
运行
复制
alarmManager.set(AlarmManager.RTC_WAKEUP, time, PendingIntent.getBroadcast(context, nextAlarmId, intentAlarm, PendingIntent.FLAG_ONE_SHOT));

第一部分

代码语言:javascript
运行
复制
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);
        }

第二部分

代码语言:javascript
运行
复制
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, time, PendingIntent.getBroadcast(context, nextAlarmId, intentAlarm, 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, Context.MODE_PRIVATE);
        int nextAlarmId = alarmPrefs.getInt(nextAlarmField, 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部分-database代码

代码语言:javascript
运行
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2019-11-04 19:16:05

当然,错误消息说:

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

这意味着:

CursorIndexOutOfBoundsException将光标视为集合,您超出了界限

您希望在集合中的位置0访问的Index 0 requested

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

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

但是是的,基本上你的光标是空的,检查你正在做的查询。您还可以在游标上断点,并在teh内容解析器上尝试其他查询。

您还可以使用像Stetho这样的工具来检查设备上的数据库,看看它是否有任何数据(并进行一些查询)。

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

或者移开游标,使用新推荐的数据库访问库(如Room):

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58688408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档