核心数据与iCloud设计

5
我使用iOS 7并希望将核心数据与iCloud一起使用,这方面已经很好地实现了。但我想请教一个问题:我的一些Core Data对象涉及到相关的图像/大型文本文件,我将它们存储为文件,并将其URL作为字符串属性设置。显然,这种方法不能与iCloud Core Data同步工作,因为iCloud不知道这些文件。您是否有任何处理此问题的建议?
1)我可以直接将图像数据和大型文本文件存储为Core Data属性,但这似乎不是最佳选择。
2)我可以使用iCloud来存储文档,然后尝试在不同的iOS设备之间保持文件同步,但这可能会变得混乱。
3)还有其他解决方案吗?
有什么建议吗?
谢谢!
丹尼尔

你是否愿意使用第三方工具来完成这个任务?我有一个朋友曾经出色地完成了同样的事情,并提供了相应的服务。 - logixologist
你有这个第三方工具的信息链接吗? - Daniel
是的...它是由@Jiva DeVoe创建的:http://stackoverflow.com/users/705569/jiva-devoe,名为Wasabi Sync。 - logixologist
http://wasabisync.com/ - logixologist
你为什么不直接将它们存储为核心数据中的属性呢?我使用可转换属性来存储富文本和嵌入式图片,其中一些图片是8MB的JPEG。看起来效果很好,但最大的数据库大约100MB左右。将图像和文本分别以相同的方式存储也同样容易。 - Duncan Groenewald
2个回答

5
如果您正在以编程方式设置模型,请向setAllowsExternalBinaryDataStorage:添加一条消息,以允许Core Data自动决定何时将其保存为记录或单独的文件。当Core Data决定使用外部文件时,它会为您管理这些文件,因此在iCloud中应该可以“轻松工作”。
NSAttributeDescription * imageAttribute;
//Initialise, setup, add to model, etc
[imageAttribute setAttributeType: NSBinaryDataAttributeType];
[imageAttribute setAllowsExternalBinaryDataStorage:YES];

在模型编辑器 UI 中,该属性有相应的复选框。

https://developer.apple.com/library/ios/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSAttributeDescription_Class/reference.html#//apple_ref/doc/uid/TP30001175-SW26


那么这意味着我直接将属性值设置为imagedata或字符串? - Daniel
您可以设置该属性以存储图像的NSData。 - Fruity Geek
在我的测试中,iCloud并不能“自动工作”。除非存储文件存储在普适容器中,否则Core Data不会同步外部文件,因此外部文件的子目录也会被同步。我不确定这是否是Core Data支持的配置。找不到任何Apple文档说明它是支持的,但似乎也没有说它不支持 - 只是无法正常工作! - Duncan Groenewald

3
将文件放入iCloud文档沙盒中,它们将在所有设备上同步。您可以使用相对引用,因为它们将以相同的相对位置出现在文件系统中。 <ubiquitous container URL>/Documents/something.jpg 一个小问题是同步不是无缝的,如果项目尚未在设备上,则必须明确要求从iCloud下载该项。
所以,在其最原始的形式下...
NSDictionary *dict = [urlToIcloudResource resourceValuesForKeys:@[NSURLUbiquitousItemIsDownloadedKey] error:&error];

NSNumber *isDownloaded = dict[NSURLUbiquitousItemIsDownloadedKey];

if (![isDownloaded boolValue]) {
   BOOL res = [[NSFileManager defaultManager] startDownloadingUbiquitousItemAtURL:urlToIcloudResource error:&error];
}

所以,您可以继续使用将它们倾倒到文件系统中并只使用字符串引用的当前策略。iCloud 将使它们保持同步。这种解决方案的适用性取决于这些大型 blob 是否为一次写入多次读取的对象(非常适合),还是读写频繁类型的对象(更加棘手)。
一个优点是对于像 txt 或 json 这样的文本对象,如果您保留文件扩展名,iCloud 应该可以“轻松工作”,以便在多个设备上同步编辑。
原始数据对象,如 jpg 或 pdf,将以最后一次编辑为准。

1
Fruity Geek的建议不是更直接吗?为什么你要采取这种方法而不是他建议的那种呢? - Daniel
这只是一种不同的方法,可以让您完全控制您正在存储的对象。可能对您有用。也可能不是。 :-) - Warren Burton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接