I created an event with repeat rule "FREQ=MONTHLY;BYMONTHDAY=16;COUNT=10". I saw the event on my two Android Calendars apps, and also on Google Calendar web site. I can read all other events from my app, but I do not see this event. Only difference is that this event has repeat rule. Here is my code for reading.
public static MyEvents readCalendarMyEvent(Context context,Date date1, Date date2, int calendarID)
{
try
{
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(date1);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(date2);
Uri l_eventUri;
if (Build.VERSION.SDK_INT >= 8) {
l_eventUri = Uri.parse("content://com.android.calendar/events");
} else {
l_eventUri = Uri.parse("content://calendar/events");
}
ContentResolver contentResolver = context.getContentResolver();
String dtstart = "dtstart";
String dtend = "dtend";
String[] l_projection = new String[] { CalendarContract.Events.CALENDAR_ID,
CalendarContract.Events.TITLE, //1
CalendarContract.Events.DESCRIPTION,
CalendarContract.Events.DTSTART,
CalendarContract.Events.DTEND,
CalendarContract.Events.EVENT_LOCATION,
CalendarContract.Events.EVENT_TIMEZONE,//6
CalendarContract.Events.HAS_ALARM,
CalendarContract.Events.RRULE,
CalendarContract.Events.RDATE,
CalendarContract.Events.ORGANIZER,
CalendarContract.Events.SELF_ATTENDEE_STATUS,//11
CalendarContract.Events.GUESTS_CAN_MODIFY,
CalendarContract.Events._ID,
CalendarContract.Events.ALL_DAY,
CalendarContract.Events.DELETED,
CalendarContract.Events.GUESTS_CAN_INVITE_OTHERS,//16
CalendarContract.Events.GUESTS_CAN_SEE_GUESTS,
CalendarContract.Events.ALL_DAY,
CalendarContract.Events.ACCESS_LEVEL,
CalendarContract.Events.AVAILABILITY,
CalendarContract.Events.EXRULE,
CalendarContract.Events.EXDATE
};
String where = "(" + dtstart + ">"
+ calendar1.getTimeInMillis() + " and "
+ dtend + "<" + calendar2.getTimeInMillis() + " and "+
CalendarContract.Events.CALENDAR_ID + " = '" + String.valueOf(calendarID) +"')";
Cursor cursor= contentResolver.query(l_eventUri, l_projection, where, null,
"dtstart ASC");
cursor.moveToFirst();
// fetching calendars id
String str="";
MyEvents myEvents = new MyEvents();
for (int i = 0; i < cursor.getCount(); i++) {
int delete = cursor.getInt(15);
if( delete == 1)
{
cursor.moveToNext();
continue;
}
MyEvent myEvent = new MyEvent();
myEvent.ID = cursor.getInt(0);
myEvent.TITLE = cursor.getString(1);
myEvent.Note = cursor.getString(2);
str = cursor.getString(3);
if(str != null || str.length() <1)
{
myEvent.START_DATE = MillisecondsToDateTime(Long.parseLong(str));
myEvent.StartDate = getDate(Long.parseLong(str));
}
else
{
cursor.moveToNext();
continue;
}
str = cursor.getString(4);
if(str != null || str.length() <1)
myEvent.END_DATE = MillisecondsToDateTime(Long.parseLong(str));
myEvent.EVENT_LOCATION =cursor.getString(5);
myEvent.EVENT_TIMEZONE =cursor.getString(6);
myEvent.HAS_ALARM = cursor.getInt(7);
myEvent.RRULE = cursor.getString(8);
myEvent.RDATE = cursor.getString(9);
myEvent.ORGANIZER =cursor.getString(10);
myEvent.SELF_ATTENDEE_STATUS = cursor.getInt(11);
myEvent.GUESTS_CAN_MODIFY = cursor.getInt(12);
myEvent.EVENT_ID = cursor.getInt(13);
myEvent.ALL_DAY = cursor.getInt(14);
myEvent.GUESTS_CAN_INVITE_OTHERS= cursor.getInt(16);
myEvent.GUESTS_CAN_SEE_GUESTS= cursor.getInt(17);
myEvent.ALL_DAY= cursor.getInt(18);
myEvent.ACCESS_LEVEL= cursor.getInt(19);
myEvent.AVAILABILITY= cursor.getInt(20);
myEvent.EXRULE = cursor.getString(21);
myEvent.EXDATE = cursor.getString(22);
myEvents.Add(myEvent);
cursor.moveToNext();
}
return myEvents;
}
catch(Exception ex)
{
ex.printStackTrace();
}
return new MyEvents();
}
The problem was resolved. I made a mistake in the where clause. The following is correct on