Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios iCloud是否以静默方式将核心数据持久存储文件从一个设备复制到另一个设备?非唯一NSManagedObjectId?_Ios_Core Data_Icloud - Fatal编程技术网

Ios iCloud是否以静默方式将核心数据持久存储文件从一个设备复制到另一个设备?非唯一NSManagedObjectId?

Ios iCloud是否以静默方式将核心数据持久存储文件从一个设备复制到另一个设备?非唯一NSManagedObjectId?,ios,core-data,icloud,Ios,Core Data,Icloud,我有一个应用程序,它使用一种专有方法将数据从应用程序同步到服务器,并返回到用户正在使用的任何其他应用程序(iOS和Android) 我没有使用iCloud同步,我也不想使用iCloud核心数据同步,所以我只想说明我并不是在尝试这样做 当应用程序上载要在服务器上创建的新记录时,它会发送nsManagedObject.objectID的URIRepresentation,文档中说它是托管对象的一个紧凑的通用标识符,以便服务器可以检测以前是否已经看到过该记录(也许应用程序已经尝试上载此数据,但在稍后的

我有一个应用程序,它使用一种专有方法将数据从应用程序同步到服务器,并返回到用户正在使用的任何其他应用程序(iOS和Android)

我没有使用iCloud同步,我也不想使用iCloud核心数据同步,所以我只想说明我并不是在尝试这样做

当应用程序上载要在服务器上创建的新记录时,它会发送
nsManagedObject.objectID的
URIRepresentation
,文档中说它是
托管对象的一个紧凑的通用标识符
,以便服务器可以检测以前是否已经看到过该记录(也许应用程序已经尝试上载此数据,但在稍后的过程中出现了一些失败,因此这有助于我们避免在服务器上创建重复记录)

下面是对象id的示例:
x-coredata://80978028-AEB5-45F0-AAD5-F328C4B294AF/MedicineShot/p1481

根据文档,这个对象id对于我的应用程序来说应该是唯一的……但是我真的不知道唯一性的范围是什么,例如,如果一个人在iPhone和iPad上有我的应用程序,它会在两个不同的设备上的这两个不同的商店中生成相同的对象id吗

我们已经运行此应用程序/服务器6年了,我们从未遇到过id冲突,这是我们所知道的,但我们似乎遇到过一次

一个用户在他们的iPhone上用上述示例coredata id创建了一个记录。5天后,同一个用户在他们的iPad上创建了一个新记录,并且该记录具有完全相同的coredata id。由于我们的同步服务器使用该id来确定是否接收到创建其已创建记录的请求,因此服务器处理了这两个不同的请求同样的

我们以前从未见过这种情况,文档似乎说这种情况不应该发生,因为这些Id应该是唯一的。托管对象Id应该是托管对象的通用Id,但这是两个不同的设备,在两个不同的日子(相隔5天)创建两个不同的记录…具有相同的Id

这是同一个用户,他可能在两台设备上使用同一个苹果帐户

iCloud是否可以秘密地将持久存储文件从一个设备复制到另一个设备

如果是这样的话,我们有没有办法防止iCloud复制这些持久数据存储文件,从而确保在设备之间获得唯一的ID


编辑:对象id uri的UUID看起来是
80978028-AEB5-45F0-AAD5-F328C4B294AF
,并且UUID应该如名称所示是普遍唯一的。对象id的这一部分是UUID吗?如果是这样,两个不同设备上的核心数据持久存储如何产生相同的对象id uri?

不管文档如何tion建议,托管对象ID仅在特定的持久存储文件中是唯一的。它们不能保证在任何地方都是唯一的。我知道,我也读过文档,我知道它们说“通用的”——但我认为还需要注意它们说

标识符包含准确描述持久存储中的对象所需的信息

但他们没有提到多个持久存储。核心数据最初是为在应用程序中使用而创建的,而文档并不总是跟上同步到服务器或其他设备的想法

URI的形式--
x-coredata://80978028-AEB5-45F0-AAD5-F328C4B294AF/MedicineShot/p1481
--未记录,但部分内容如下:

  • UUID:特定持久存储的标识符。它还保存在持久存储的元数据中,以便实例和存储可以匹配
  • MedicineShot
    :用于此实例的实体
  • p1481
    p
    意味着“永久”(临时ID有一个
    t
    和一个不同的格式),而
    1481
    基本上是持久存储中的一个递增主键。它从0开始,每次插入实体的新实例时递增

在另一个存储中使用一个存储中的托管对象ID不太可能正常工作。除了UUID之外,唯一ID将不匹配,除非您非常小心地始终以相同的顺序插入新实例。

我不相信唯一性范围已被记录,但我个人不会将唯一性计算在给定的持久存储之外因为这是使用托管对象标识符的范围。如果iOS在设备之间秘密复制数据(它没有)这样就可以避免问题,因为您在两台设备上有相同的记录,并且具有相同的id,而不是不同的记录。用户可以还原备份。如果需要唯一性,您可能应该生成自己的唯一标识符,而不是依赖于托管对象id。@Paulw11如果持久存储文件是从当MedicineShot p1480被插入时,一个设备切换到另一个设备…然后iphone插入另一个设备,ipad插入另一个设备…这两个设备都是p1481,但它们是不同的记录。我不是在描述持续复制,而是像一次性还原复制之类的。我不确定。对象ID的第一部分,我相信,是永久存储区的标识符()因此,备份/恢复理论似乎是有道理的。事实证明,这里的问题是,他们将应用程序从iCloud备份恢复到了新手机上。因此,两个不同设备上的持久存储使用了相同的uuid。因此,两个不同的设备随后插入了下一条记录,该记录恰好属于相同的实体类型,因此managedobjectid对于两个不同的记录完全相同。当这些设备尝试将这些记录同步到我们的服务器时,我们的服务器错误地检测到第二个记录是“重复”尝试创建以前创建的记录。