如何将初始数据播种到Core Data + iCloud?

kro*_*ger 4 iphone core-data ios icloud

我正在开发一个使用Core Data和iCloud的新应用.我正在关注iCloudCoreDataStack演示和iCloud设计指南.到目前为止,设备之间的同步运行良好,但我还没有弄清楚如何在用户的第一台设备上使用应用程序时播种少量数据,如果应用程序在第二台设备上使用,则跳过播种(因为它应该从iCloud下载).

这应该很简单,只要询问iCloud Container是否有任何数据.下载数据(如果存在)或创建新数据(如果不存在).但我找不到办法做到这一点:-(

我可以想到三种方法来解决这个问题:

  1. 使用migratePersistentStore:toURL:options:withType:error:我的数据量非常少,所以对于这种情况,这感觉就像是矫枉过正

  2. 在NSUbiquitousKeyValueStore上存储一个值以标记是否已经进行了初始同步我尝试使用NSUbiquitousKeyValueStore,但有时从UbiquitousKeyValueStore获取值需要很长时间,因此即使在不需要时也会创建种子数据,从而导致重复.

  3. 使用sentinel文件与#2具有相同的效果(我不知道如何实现这个)

该应用程序仅适用于iOS 7和新版本,因此无需迁移旧用户数据.

我发现的每个相关教程和书籍似乎都使用iOS7之前的超级复杂的处理方式(例如使用后备存储),这在iOS 7中是不必要的.

要么我缺少某些东西(通常是这种情况),要么这比它应该更复杂.我感谢任何建议和指示.

ImH*_*its 7

使用初始数据集为分布式数据存储区播种永远不是一个好主意.通常,这些初始数据可以打包到随应用程序一起提供的存储文件中,并作为第二个持久存储添加到应用程序的托管对象上下文使用的协调器中.

也就是说,基于Core Data初始导入的完成,种子虽然不明智是可能的.

您需要等待NSPersistentStoreCoordinatorStoresDidChangeNotification,并将NSPersistentStoreUbiquitousTransitionTypeKey设置为NSPersistentStoreUbiquitousTransitionTypeInitialImportCompleted.

如果商店中没有数据,您可以在该点播种初始数据集.

但是,重要的是要意识到多个设备可以在不导入种子数据的情况下接收初始导入通知,从而再次播种.没有办法避免这种情况.


关于使用您的应用程序发送第二个持久性存储的问题,用作种子数据.

这是在Marcus通过将其作为只读存储添加到应用程序的托管对象上下文正在使用的持久性存储协调器时指出的.

NSDictionary *options = @{ NSReadOnlyPersistentStoreOption: @YES };
[_psc addPersistentStoreWithType:NSSQLiteStoreType
                   configuration:nil
                             URL:seedStoreURL
                         options:options
                           error:&localError];

NSDictionary *iCloudOptions = @{ NSPersistentStoreUbiquitousContentNameKey: @"storeName" };
[_psc addPersistentStoreWithType:NSSQLiteStoreType
                   configuration:nil
                             URL:iCloudStoreURL
                         options:iCloudOptions
                           error:&localError];

_moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[appMOC setPersistentStoreCoordinator:_psc];
Run Code Online (Sandbox Code Playgroud)

这样,应用程序的托管对象上下文可以访问两个存储中的数据,并从获取请求中获取这两个集.托管对象上下文也足够智能,可以自动将新对象插入到正确的存储中(因为其中一个是只读的).

唯一的技巧是,如果您希望用户能够从种子库修改数据,则需要将这些对象移动到iCloud存储.

这比尝试迁移批量数据集更容易,因为理想情况下,您的用户一次只能使用一个设备.在发生冲突的情况下,您最多必须解决一些重复记录,而不是尝试检测整个数据集中的重复.

  • 正如他所说,不要播种数据,获取种子数据并将其作为第二个只读持久存储添加到您的`NSPersistentStoreCoordinator`.当您需要"更新"种子数据时,这将节省您的痛苦. (2认同)
  • `NSPersistentStoreUbiquitousTransitionTypeKey`设置为`NSPersistentStoreUbiquitousTransitionTypeInitialImportCompleted`实际上有效吗?试图从`notification.userInfo`获取`NSPersistentStoreUbiquitousTransitionTypeKey`总是为我返回`NULL`. (2认同)