我正在尝试使用Android的日历提供商管理我的应用中的日历活动。在documentation page以下方法中删除一个事件并打开显示日历中的事件:
删除一个事件:
private static final String DEBUG_TAG = "MyActivity";
...
long eventID = 201;
...
ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
Uri deleteUri = null;
deleteUri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID);
int rows = getContentResolver().delete(deleteUri, null, null);
Log.i(DEBUG_TAG, "Rows deleted: " + rows);
使用日历意图打开日历中的特定事件:
long eventID = 208;
...
Uri uri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID);
Intent intent = new Intent(Intent.ACTION_VIEW)
.setData(uri);
startActivity(intent);
这非常有效,但我注意到,与创建和检索事件等其他事务不同,日历ID似乎没有意义。为什么会这样? 我可以安全地假设系统保证所有日历中的所有事件ID都是唯一的吗?或者可能有多个具有相同ID的事件,然后会发生什么?
答案 0 :(得分:1)
是的,这个假设是正确的。您使用Uri传递的事件ID直接映射到行_id
字段,该字段是事件表的主键。
因此,每个事件都有一个(系统范围的)唯一ID。
如果您按照CalendarProvider2中的deleteEventsInternal
来电,可以看到您传递的ID与事件表的_id
字段进行比较。
line 3222中的选择最终会评估为_id = <the ID you passed>
关于你的问题“为什么会这样?”:
日历和事件之间的关系是一对多关系,这意味着一个日历可能包含多个事件,但一个事件只属于一个日历。
在日历数据库中表示的方式是在关系数据库中对此进行建模的标准方法,请参阅http://www.databaseprimer.com/pages/relationship_1tox/
在数据库设计中,这也称为Second normal form。