采用iCloud设计的核心数据

时间:2013-11-08 19:59:17

标签: ios core-data icloud

我在iOS 7上想要使用iCloud的核心数据,这很好用,我想要输入的问题如下。

我的一些核心数据对象具有相关图像/大文本文件,我将其作为文件存储在文件系统中,只是将这些项目的URL设置为字符串属性。现在显然这不会与iCloud核心数据同步一起工作,因为iCloud没有这些文件的概念。我想知道你是否有任何关于如何处理这个问题的建议?

1)我可以直接将图像数据和大文本文件存储为核心数据属性,但它似乎不是最佳方式

2)我可以使用iCloud存储文档,然后以某种方式尝试在不同的iOS设备中保持文件之间的同步,但这可能会变得混乱。

3)其他一些解决方案。

任何建议?

此致

丹尼尔

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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是一次写入多次读取(非常合适)还是读写常常类型对象(棘手)。

一个优点是,对于txtjson这样的文本对象,如果您在文件中保留扩展名,则iCloud应该“正常工作”以保持多个设备编辑同步。

jpgpdf等原始数据对象将是最后一次编辑获胜。