我正在开发一个使用 Core Data 和 iCloud 的新应用程序。我正在关注 iCloudCoreDataStack 演示和 iCloud 设计指南。
到目前为止,设备之间的同步运行良好,但我还没有弄清楚如何在用户的第一台设备上第一次使用该应用程序时播种少量数据,如果在第二台设备上使用该应用程序,则跳过播种(因为它应该从 iCloud 下载)。
这应该很简单,只需询问 iCloud Container 是否有任何数据。下载数据(如果存在)或创建新数据(如果不存在)。
但我找不到办法做到这一点:-(
我可以想到三种方法来解决这个问题:
我的数据量非常少,所以对于这种情况,这感觉有点矫枉过正
我尝试使用 NSUbiquitousKeyValueStore,但有时从
UbiquitousKeyValueStore,因此即使在不需要时也会创建种子数据,从而导致重复。
该应用程序仅适用于 iOS 7 且为新版本,因此无需迁移旧用户数据。
我发现的每个相关教程和书籍似乎都在使用 iOS 7 之前不需要的 super 复杂的做事方式(例如使用后备商店)。
要么我遗漏了一些东西(通常是这种情况),要么这比它应该的更复杂。
我感谢任何建议和指示。
最佳答案
用初始数据集为分布式数据存储做种子从来都不是一个好主意。通常,这些初始数据可以打包到应用程序附带的存储文件中,并作为第二个持久存储添加到应用程序的托管对象上下文使用的协调器中。
也就是说,这是有可能的,尽管基于 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];
通过这种方式,您的应用程序的托管对象上下文可以访问来自两个存储的数据,并将从 fetch 请求中获取两个集合。托管对象上下文也足够智能,可以自动将新对象插入正确的存储中(因为其中之一是只读的)。
唯一的技巧是,如果您希望您的用户能够修改种子存储中的数据,您需要将这些对象移动到 iCloud 存储中。
这是一种比尝试批量迁移数据集更容易的方法,因为理想情况下,您的用户一次只使用一个设备。在发生冲突的情况下,您最多必须解决一些重复的记录,而不是尝试检测整个数据集的重复。
关于ios - 如何将初始数据播种到 Core Data + iCloud?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21005285/