从Android上的Calendar Provider中删除事件
我有一个应用程序,它使用Calendar Provider来添加,编辑和删除事件。 我有一个日历界面,显示哪些日子附有活动。 添加事件非常有效。 为了添加事件,我使用数字3对calendarID进行了硬编码,因此calID = 3。
long calID=3; values.put(Events.DESCRIPTION, description); values.put(Events.CALENDAR_ID, calID); values.put(Events.EVENT_TIMEZONE, "Europe/London"); Uri uri = cr.insert(Events.CONTENT_URI, values);
这非常有效。 我编程的视图显示了事件。 我打开手机中包含的日历应用程序(Xperia J),我可以看到事件就在那里。
我尝试使用以下代码删除事件:
ContentResolver cr = mContext.getContentResolver(); ContentValues values = new ContentValues(); Uri deleteUri = null; deleteUri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID); int rows = mContext.getContentResolver().delete(deleteUri, null, null);
此代码直接从developer.android.com网站复制。 这不删除! 我调试了代码,’rows’的值等于1,所以行应该被删除了。 但是我回到我的应用程序,事件仍然存在。 有趣的是:我已经检查了手机中的日历应用程序,并且该事件不存在。 所以它已被删除(?)。 我想也许我不刷新我的应用程序,所以我关闭它,重新安装它,它永远不会删除。 我再次调试代码进行删除,并且’rows’值再次等于1,对于同一个事件! 因此,’rows’总是返回1我想删除它。 因此该行已删除,但未删除。
这里发生了什么? 是因为当我添加事件时,我硬编码了calendarID吗?
正如您所注意到的,在事件同步到服务器之前,删除事件并不会真正从数据库中删除该行。 这是非常合乎逻辑的,否则日历同步适配器将无法检索事件数据以向服务器发送DELETE请求。 这就是事件表中有一个DELETED列的原因,您在查询事件时必须检查该列:
http://developer.android.com/reference/android/provider/CalendarContract.SyncColumns.html#DELETED
顺便说一句,如果您查询实例而不是事件(执行周期性事件的扩展),则会从结果中自动删除已删除的事件。
解决了。 基本上问题是该事件似乎是在手机上本地删除,但尚未与我的Google帐户同步。 同步后,这些事件都会从我的手机中移除,而我的Google帐户则与手机相关联。
这是另一个certificate在Android上编程很烦人的证据,特别是当没有特别注意这些细节时。 我失去了两天只是为了找出这个基本问题……
删除有两个版本:作为应用程序和同步适配器。 应用程序删除将已删除的列设置为1.此标志告诉同步适配器该行已被删除,并且此删除应传播到服务器。 同步适配器删除会从数据库中删除该事件及其所有关联数据。
- 部分加载来自URL的图像,就像在WhatsApp中实现的那样
- Java Eclipse Android初学者问题 – 如何添加库或链接文件夹。 初学者参考
- 在游戏暂停之前复制当前屏幕的图片使其模糊并在游戏暂停期间渲染到屏幕
- 在Android 4.4.2上更改SMS应用程序默认值
- 模拟android.content.res.Configuration类型的对象并为其指定一个语言环境
- 如何解决java中的双精度问题
- 将Java.Security.KeyPair转换为.NET RSACryptoServiceProvider
- 即使手机有硬件菜单按钮,如何始终显示溢出菜单(ActionBar)?
- 如何在openCV中将轮廓转换为图像中心?