在将事件添加到Android日历之前检查事件是否存在

时间:2012-11-20 05:12:30

标签: android events calendar android-4.0-ice-cream-sandwich querying

我的应用中有一系列事件。侧面的按钮允许用户将事件日期和时间添加到他/她的日历中。我使用日历意图将用户重定向到相应日期和时间的android日历。现在用户将事件添加到他的日历后,我想禁用“添加事件”按钮,该按钮对应于他/她已经添加的事件(因此用户避免再次添加相同的事件)。我怎样才能做到这一点?我已经完成了针对Android 4.0的新日历API,但我无法实现我想要的。

基本上我想要的是避免在用户日历中重复输入相同的事件。

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:7)

如果存在此事件的实例,则应测试。请参阅documentation of the Android's CalendarContract.Instances class

尤其是second query method在这种情况下应该会有所帮助。

这个示例是一些代码,我发布在blog post about the CalendarContract provider上 - 根据您的需要略有改动:

long begin = // starting time in milliseconds
long end = // ending time in milliseconds
String[] proj = 
      new String[]{
            Instances._ID, 
            Instances.BEGIN, 
            Instances.END, 
            Instances.EVENT_ID};
Cursor cursor = 
      Instances.query(getContentResolver(), proj, begin, end, "\"Your event title\"");
if (cursor.getCount() > 0) {
   // deal with conflict
}

请注意:自纪元以来,时间总是以UTC毫秒为单位。因此,您可能需要根据用户的时区进行调整。

最后一个参数应包含您添加到日历中的事件的标题。保留引号 - 否则Android会查找“您的”或“事件”或“标题”!

不要忘记包含必要的权限。

答案 1 :(得分:1)

我使用以下方式检查它...我传递的是event_id以检查它是否在日历中....

public boolean isEventInCal(Context context, String cal_meeting_id) {

     Cursor cursor = context.getContentResolver().query(
     Uri.parse("content://com.android.calendar/events"),
       new String[] { "_id" }, " _id = ? ",
       new String[] { cal_meeting_id }, null);

           if (cursor.moveToFirst()) {
                   //Yes Event Exist...
      return true;
     }
     return false;
    }

答案 2 :(得分:0)

请检查此内容,这可能会有所帮助:

private static boolean isEventInCalendar(Context context, String titleText, long dtStart, long dtEnd) {

    final String[] projection = new String[]{CalendarContract.Instances.BEGIN, CalendarContract.Instances.END, CalendarContract.Instances.TITLE};
    Cursor cursor = CalendarContract.Instances.query(context.getContentResolver(), projection, dtStart, dtEnd);
    return cursor != null && cursor.moveToFirst() && cursor.getString(cursor.getColumnIndex(CalendarContract.Instances.TITLE)).equalsIgnoreCase(titleText);
}

答案 3 :(得分:0)

不建议在UI线程上运行Instances.query,但是可以通过确保开始和结束时间最小化来有效地完成。

搜索字符串将搜索所有值,而不仅是标题,因此添加循环以检查是否需要精确的字段值。

public boolean eventExistsOnCalendar(String eventTitle, long startTimeMs, long endTimeMs) {
  if (eventTitle == null || "".equals(eventTitle)) {
    return false;
  }
  if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
    return false;
  }
  // If no end time, use start + 1 hour or = 1 day. Query is slow if searching a huge time range
  if (endTimeMs <= 0) {
    endTimeMs = startTimeMs + 1000 * 60 * 60; // + 1 hour
  }

  final ContentResolver resolver = mContext.getContentResolver();
  final String[] duplicateProjection = {CalendarContract.Events.TITLE}; // Can change to whatever unique param you are searching for
  Cursor cursor =
      CalendarContract.Instances.query(
          resolver,
          duplicateProjection,
          startTimeMs,
          endTimeMs,
          '"' + eventTitle + '"');

  if (cursor == null) {
    return false;
  }
  if (cursor.getCount() == 0) {
    cursor.close();
    return false;
  }

  while (cursor.moveToNext()) {
    String title = cursor.getString(0);
    if (eventTitle.equals(title)) {
      cursor.close();
      return true;
    }
  }

  cursor.close();
  return false;
}