Исключение: - android.database.CursorIndexOutOfBoundsException: индекс 0 запрошен, с размером 0 - PullRequest
0 голосов
/ 04 ноября 2019

Создание уведомления о тревоге и просто не могу понять, почему я продолжаю сталкиваться с ошибкой

android.database.CursorIndexOutOfBoundsException: Индекс 0 запрошен, с размером 0

, это терпит неудачув (в расписании курса будильник () часть.

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, 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код базы данных

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;
}

1 Ответ

0 голосов
/ 04 ноября 2019

Конечно, сообщение об ошибке гласит:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...