无法删除Android日历

无法删除Android日历,android,android-calendar,Android,Android Calendar,我一直在玩Android来创建本地(非同步)日历,但最终我得到了空ACCOUNT\u TYPE和ACCOUNT\u NAME的日历。我可以在以下方面看到它们: getContentResolver().query(CalendarContract.Calendars.CONTENT_URI, null, CalendarContract.Calendars.ACCOUNT_TYPE + " IS NULL", null, null); 现在,我的谷歌日历应用程序在启动时崩溃:( 我试图用这段代

我一直在玩Android来创建本地(非同步)日历,但最终我得到了空
ACCOUNT\u TYPE
ACCOUNT\u NAME
的日历。我可以在以下方面看到它们:

getContentResolver().query(CalendarContract.Calendars.CONTENT_URI, null, CalendarContract.Calendars.ACCOUNT_TYPE + " IS NULL", null, null);
现在,我的谷歌日历应用程序在启动时崩溃:(

我试图用这段代码删除这些虚拟日历(在成功请求
WRITE\u CALENDAR
权限后):

但它引发了以下错误

java.lang.IllegalArgumentException:名称不能为空:null 在 android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:165) 在 android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135) 在 android.content.ContentProviderProxy.delete(ContentProviderNative.java:544) 在android.content.ContentResolver.delete上(ContentResolver.java:1327)

我认为这是由于他们的帐户类型/名称为空

你知道我怎样才能摆脱他们吗

注意:该设备的Android版本是6.0.1(请注意,所有链接都指向5.1.1日历提供程序,但可能可以安全地假设它在Android 6中工作相同):

  • 删除日历将始终通过以下行:
  • 现在,在方法中,
    modifyCalendarSubscription
    被调用,用于删除每个日历(无论您如何选择它们)
  • modifyCalendarSubscription
    中,提供程序读取每个日历的“帐户名称”和“帐户类型”列,并尝试创建一个
  • 由于数据库中的帐户名和类型为
    null
    ,因此在检查
    null
    值时,它会在中崩溃。这就是您看到的eException实际抛出的地方
  • 因此,无论您如何删除日历,它都会在
    帐户
    构造函数中失败,因为数据库中的帐户名为空

    我还没有检查它,但您可能可以使用更新操作覆盖帐户名和类型。因此,请尝试将其设置为非
    null

    如果不起作用,您需要root访问权限手动删除日历,或者转到
    设置
    ->
    应用程序
    ->
    所有应用程序
    ->
    日历存储
    并清除整个日历数据库(
    清除数据

    更新

    覆盖
    ACCOUNT\u NAME
    ACCOUNT\u TYPE
    列只有在您设法匹配通过此行的条件时才会起作用:给定该行以及到达该行的条件在Android 6中仍然存在。
    它认为,如果你不将日历id附加到
    Uri
    中,也不根据日历id选择日历,那么应该可以工作。因此,让你的
    删除
    更新
    ,并将
    帐户名
    帐户类型
    重置为非
    null
    应该可以解决问题。

    我也有同样的问题em.I按如下方式更新日历行:

    private void updateNullAccount() {
            String selection = CalendarContract.Calendars.ACCOUNT_NAME + " IS NULL";
            Uri uri = CalendarContract.Calendars.CONTENT_URI;
            uri = SyncAdapter.asSyncAdapter(uri);
            ContentValues values = new ContentValues();
            values.put(CalendarContract.Calendars.ACCOUNT_NAME, "NAME BITCH NAME");
            values.put(CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL);
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    ActivityCompat#requestPermissions
                // here to request the missing permissions, and then overriding
                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                //                                          int[] grantResults)
                // to handle the case where the user grants the permission. See the documentation
                // for ActivityCompat#requestPermissions for more details.
                return;
            }
            int count = getContentResolver().update(uri, values, selection, null);
            count++;
        }
    
    在按帐户名称删除日历后,我在更新中有


    创建本地日历时,必须附加查询参数(如同步适配器、帐户名称和帐户类型)并且在ContentValues中添加相同的帐户名和帐户类型参数。

    我明白了。您在系统日志中看到任何异常吗?我在问题中提出的唯一一个异常是您的设备已根目录。在这种情况下,您可以手动从数据库中删除日历。在覆盖
    帐户类型
    帐户名
    后,我可以成功s完全删除它们。谢谢。
    null
    不能是
    null
    。Duh。这里有什么不清楚的地方吗?:P我在插入事件方面也有同样的问题。谷歌的异常消息没有什么帮助。
    private void updateNullAccount() {
            String selection = CalendarContract.Calendars.ACCOUNT_NAME + " IS NULL";
            Uri uri = CalendarContract.Calendars.CONTENT_URI;
            uri = SyncAdapter.asSyncAdapter(uri);
            ContentValues values = new ContentValues();
            values.put(CalendarContract.Calendars.ACCOUNT_NAME, "NAME BITCH NAME");
            values.put(CalendarContract.Calendars.ACCOUNT_TYPE, CalendarContract.ACCOUNT_TYPE_LOCAL);
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    ActivityCompat#requestPermissions
                // here to request the missing permissions, and then overriding
                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                //                                          int[] grantResults)
                // to handle the case where the user grants the permission. See the documentation
                // for ActivityCompat#requestPermissions for more details.
                return;
            }
            int count = getContentResolver().update(uri, values, selection, null);
            count++;
        }