创建警报通知,只是无法弄清为什么我一直遇到错误
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;
}