Aug 272010
 

I had application on market for quite a while and suddenly I started receiving “SQLiteException”. Quick look at stack trace showed little bit more details:

android.database.sqlite.SQLiteException: no such column: Calendars._id: , while compiling: SELECT _id, title, dtstart FROM view_events WHERE (1) AND (Calendars._id=1)

This clearly pointed toward code that fills calendar events. Generally it looked like this:

Uri calendarsUri;
Uri eventsUri;
if (android.os.Build.VERSION.SDK_INT <= 7) { //up-to Android 2.1
    calendarsUri = Uri.parse("content://calendar/calendars");
    eventsUri = Uri.parse("content://calendar/events");
} else { //Android 2.2 (Froyo) and later
    calendarsUri = Uri.parse("content://com.android.calendar/calendars");
    eventsUri = Uri.parse("content://com.android.calendar/events");
}
...
Cursor cursor = resolver.query(eventsUri, new String[]{ "_id", "title", "dtstart" }, "Calendars._id=" + calendarId, null, null);
...

Exception pointed right to that last line with query. Froyo had no idea what it should do with Calendars._id.

To make long ranting short, correct code should be:

Cursor cursor;
if (android.os.Build.VERSION.SDK_INT <= 7) { //up-to Android 2.1
    cursor = resolver.query(eventsUri, new String[]{ "_id", "title", "dtstart" }, "Calendars._id=" + calendarId, null, null);
} else {
    cursor = resolver.query(eventsUri, new String[]{ "_id", "title", "dtstart" }, "calendar_id=" + calendarId, null, null);
}

With this everything started working again and, since calendar code got first-class citizen treatment and it is finally documented in SDK, I doubt that there will be further breaking changes down the road.

  2 Responses to “Froyo and calendar”

Comments (2)
  1. Thank you very much.

  2. Nice, thx a lot!

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>