【问题标题】:Check if the event exists before adding it to the Android calender在将事件添加到 Android 日历之前检查事件是否存在
【发布时间】:2012-11-08 03:38:39
【问题描述】:

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

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

任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    您应该测试是否存在此事件的实例。请参阅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 会查找“您的”或“事件”或“标题”!

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

    【讨论】:

    • 非常感谢。正是我正在寻找的东西。但是.. 如果我包含事件标题,则查询返回 0。文档中的第一个查询(没有搜索词)完美运行。你能帮帮我吗?
    • 我最终使用第一个查询来检索开始时间和结束时间之间的所有事件,并使用 if 条件比较事件标题。
    • 对不起,我没有时间研究这个。但我还是会看看它,因为现在我对为什么第二个不起作用感兴趣。
    • 请检查一下,这可能会有所帮助: 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 = CalendarContract.Instances.query(context.getContentResolver(), projection, dtStart, dtEnd); return cursor != null && cursor.moveToFirst() && cursor.getString(cursor.getColumnIndex(CalendarContract.Instances.TITLE)).equalsIgnoreCase(titleText); }
    • 每次都是假的,你能解释一下它是如何工作的吗?
    【解决方案2】:

    我使用了以下方法来检查它...我通过 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;
        }
    

    【讨论】:

    • cal_meeting_id 是什么
    • 将其 event_id 检入日历
    【解决方案3】:

    请检查一下,这可能会有所帮助:

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多