Android EVENT_ID 跨日历是否唯一?

Is an Android EVENT_ID Unique Across Calendars?

我正在尝试使用 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,然后会发生什么?

是的,这个假设是正确的。您通过 Uri 传递的事件 ID 直接映射到行 _id 字段,这是事件 table 的主键。 所以每个事件都有一个(系统范围内的)唯一 ID。

如果您在 CalendarProvider2 中跟踪 deleteEventsInternal 的调用,您可以看到您传递的 ID 与事件 table 的 _id 字段进行了比较。

line 3222 中的选择最终计算为 _id = <the ID you passed>

关于您的问题"Why is that so?":

日历和事件之间是一对多的关系,即一个日历可能包含多个事件,但一个事件恰好属于一个日历。

在日历数据库中表示的方式是在关系数据库中建模的标准方式,请参阅 http://www.databaseprimer.com/pages/relationship_1tox/

在数据库设计中,这也称为 Second normal form