【问题标题】:Android Calendar Content Provider: allDay is true but sec, min, hour are not 0Android Calendar Content Provider:allDay 为 true 但 sec、min、hour 不为 0
【发布时间】:2014-03-18 20:04:44
【问题描述】:

我正在向内容提供商查询约会。

    Uri.Builder builder = CalendarContract.Instances.CONTENT_URI.buildUpon();
    ContentUris.appendId(builder, startMillis);
    ContentUris.appendId(builder, endMillis);
    Uri uri = builder.build();

    String[] event_projection= new String[] {
        Instances.TITLE,               
        Instances.ALL_DAY,              
        Instances.CALENDAR_COLOR,       
        Instances.EVENT_ID,            
        Instances.BEGIN,               
        Instances.END,                 
        };

    String selection = CalendarContract.Instances.VISIBLE + "='1'";

    String sortBy = CalendarContract.Instances.BEGIN + " ASC, " +
                    CalendarContract.Instances.TITLE + " ASC";

    Cursor mCursor = cr.query(uri, event_projection, selection, null, sortBy);

一些用户发送以下崩溃报告:

java.lang.IllegalArgumentException: allDay is true but sec, min, hour are not 0.
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:167)
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
    at android.content.ContentProviderProxy.query(ContentProviderNative.java:384)
    at android.content.ContentResolver.query(ContentResolver.java:372)
    at android.content.ContentResolver.query(ContentResolver.java:315)

这主要发生在 Sony Xperia 设备上,但也发生在 Google Nexus10 上。 查询数据时怎么可能得到这个异常? 首先插入数据时不应该避免这种情况吗?

这是否意味着我必须用 try/catch 包围查询? 这不会减慢查询速度吗?

【问题讨论】:

  • 众所周知,索尼会尽可能地破坏 Android API。在某些情况下,它只是坏得无法修复。

标签: android android-contentprovider android-calendar


【解决方案1】:

是的,听起来数据插入错误。如果它缩短了查询处理,异常实际上可以加快查询速度,但不会返回您要查找的数据。

异常似乎来自 Time.compare http://developer.android.com/reference/android/text/format/Time.html#compare(android.text.format.Time,%20android.text.format.Time)

这可能是由查询的 sortBy 参数引起的。尝试使用 null 并查看它是否停止使用比较器。如果这样可行,那么当 ALL_DAY 为真时,它可能与数据集上的 BEGIN 排序不兼容。

您可以在从游标读取行并更新内存中的值以使比较器满意后对集合进行排序,或者使用您自己的比较器,或者您可以修复数据(将 sec、min、hour 设置为 0,其中ALL_DAY 为真),然后再运行查询。

也许一个好的做法是在出现异常时修复数据并重试。

【讨论】:

    【解决方案2】:

    如果 allDay 设置为 1,则 eventTimezone 必须是 TIMEZONE_UTC 并且时间必须对应于午夜边界,这意味着 hour 、 minute 、 second 应该是日历对象的零。

    参考以下链接..

    http://developer.android.com/reference/android/provider/CalendarContract.Events.html

    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));           
    cal.set(2014, 03, 18, 0, 0,0);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-30
      • 2015-07-28
      • 2012-07-08
      • 1970-01-01
      • 2011-01-07
      • 2016-09-25
      • 2019-12-15
      • 1970-01-01
      相关资源
      最近更新 更多