问题描述
我有一个应用程序,它使用专有方法将数据从应用程序同步到服务器,然后返回到用户正在使用的任何其他应用程序(iOS 和 Android)。
我没有使用 iCloud 同步,也不想使用 iCloud 核心数据同步,所以我只想明确表示我不想这样做。
当应用上传要在服务器上创建的新记录时,它会发送文档所说的 URIRepresentation
的 NSManagedobect.objectID
,以便服务器可以检测到如果它之前已经看到过这个记录(也许应用已经尝试上传这个数据,但是在这个过程中后来失败了,所以这有助于我们避免在服务器上创建重复的记录)。
以下是对象 ID 的示例:A compact,universal identifier for a managed object
根据文档,这个对象 id 对于我的应用程序来说应该是唯一的...但我真的无法确定唯一性的范围是什么,例如,如果有人在 iPhone 上拥有我的应用程序并且一个 iPad,它会在两个不同设备上的两个不同商店中生成相同的对象 id 吗?
我们已经运行这个应用程序/服务器 6 年了,我们从来没有遇到过 ID 冲突,我们知道,但我们似乎遇到过。
用户在其 iPhone 上使用上述示例核心数据 ID 创建了一条记录。 5 天后,同一用户在他们的 iPad 上创建了一个新记录,它具有完全相同的核心数据 ID。由于我们的同步服务器使用该 ID 来确定它是否正在接收创建它已经创建的记录的请求,因此服务器将这两个不同的记录视为相同。
我们以前从未见过这种情况,而且文档似乎说这不应该发生,因为这些 ID 应该是唯一的。托管对象 ID 应该是托管对象的通用 ID,但这是两个不同的设备,它们在两个不同的日子(相隔 5 天)创建了两个不同的记录......具有相同的 ID。
这是同一个用户,他可能在两台设备上使用同一个 Apple 帐户。
iCloud 会不会将永久存储文件从一台设备秘密复制到另一台设备?
如果是这样,我们有没有办法阻止 iCloud 复制这些持久性数据存储文件,以便我们确保从设备到设备获取唯一 ID?
编辑:对象 id uri 似乎是 x-coredata://80978028-AEB5-45F0-AAD5-F328C4B294AF/Medicineshot/p1481
的 UUID,并且 UUID 应该是通用唯一的,正如名称所说。对象 id 的那部分是 UUID 吗?如果是这样,两个不同设备上的 Core Data 持久存储如何生成相同的对象 id uri?
解决方法
不管文档有什么建议,托管对象 ID 仅在特定的持久存储文件中是唯一的。它们不能保证在任何地方都是独一无二的。我知道,我也读过文档,我知道他们说“通用”——但我认为同样重要的是要注意他们说
标识符包含准确描述持久存储中的对象所需的信息...
但是他们没有提及多个持久存储。 Core Data 最初是为在应用中使用而创建的,文档并不总是跟上同步到服务器或其他设备的想法。
URI 的形式-- x-coredata://80978028-AEB5-45F0-AAD5-F328C4B294AF/MedicineShot/p1481
-- 未记录,但部分是:
- UUID:特定持久存储的标识符。这也保存在持久存储的元数据中,以便可以匹配实例和存储。
-
MedicineShot
:用于此实例的实体 -
p1481
:p
意味着“永久”(临时 ID 具有t
和不同的格式),而1481
基本上是持久存储中的递增主键.它从 0 开始,每次插入实体的新实例时都会向上计数。
在另一个商店中使用来自一个商店的托管对象 ID 不太可能奏效。除了 UUID 之外,除非您非常小心地始终以相同的顺序插入新实例,否则唯一 ID 将不会匹配。