如何使用Core Data在Cocoa中上传和存储文件?

时间:2014-01-15 03:28:03

标签: ios objective-c cocoa core-data

我有一个应用程序,我希望能够上传文件。我可以想象将数据序列化,将其放入数组中,然后将数组序列化并将其放入Core Data中,但这看起来并不合适。我还可以想象将文件复制到应用程序的支持文件中,为这些文件获取NSURL并存储数组或NSURL。

在任何情况下,NSURL都不是Core Data中的属性选项,也不是NSArray。

另一个潜在的问题 - 我的目标是制作一个同步的iPhone应用程序和桌面应用程序。所以我想从我的iPhone上传图片或从我的桌面上传文件,让一切都很好。我不确定复制文件是否与iPhone兼容。我希望能够上传任何类型的文件。

问题:
如何在iOS上存储图像?
如何在Mac OS X上存储文件?
我是否将二进制数据存储在核心数据中?我是否将文件复制到目录并存储NSURL?

奖励问题:
如何在iOD和Mac OS X应用程序之间进行同步?

澄清:
对于这个问题的任何混淆感到抱歉。这是一个更清洁的版本:

我的核心数据模型由一个“Entry”实体组成,该实体具有名称NSString属性和与“File”实体的一对多关系。此文件实体具有名称NSString属性和尚未确定的第二个属性。第二个属性可能是(从我可以想到的)某个文件的可转换NSData表示,NSURL的可转换表示指向某个文件(我仍然对变形的工作方式不感兴趣,所以我可能错了所有这些...),或文件数据的二进制blob。可能还有其他选择,但重点是能够从OS X或iOS将文件保存或“上传”到该程序,并将数据库同步。

我有一个带有表视图的OS X应用程序,它显示了所有条目的名称。选择条目的名称,您将获得它指向的文件列表。双击该文件,它应该使用默认应用程序打开,就像使用Finder一样。您还应该能够从Core Data导出文件并将它们保存回应用程序之外的目录。

我还有一个iOS应用程序,允许我拍照或多张图片,将它们保存到“文件”实体,从“条目”实体指向这些文件(使用与OS X应用程序相同的核心数据模型) ),并与我的OS X应用程序进行异步同步,因此两个应用程序都具有相同的数据。

我希望能够解决问题。

感谢您的帮助,

切特

3 个答案:

答案 0 :(得分:1)

我相信你还不太熟悉Core Data。我强烈建议深入研究Core Data文档。

无论如何,根据我的理解,您的数据模型的可能实现可能如下所示:enter image description here

您的用户将拥有一个NSSet of File对象,每个File对象都负责在Application Documents目录中存储名称及其URL。

关于你的第二个问题,我在那里看不到任何问题。

希望这有帮助, 干杯!

答案 1 :(得分:1)

核心数据允许您为属性的外部存储设置选项,然后IT将决定是否将对象存储在外部文件中。

因此,您将创建一个名为fileData (binary)的属性,并在您的子类中使用NSData,然后只需设置file.fileData = yourFileData,Core Data将决定将其存储在何处。

无需自行跟踪网址。不要忘记存储某种标识符(文件名),以便您检索所需的文件。

修改

顺便说一句,如果您只想存储属性字符串的图像,那么使用可转换属性可能会更好。如果要自动转换为NSImage,UIImage或NSAttributedString(或其他一些可存档对象),可转换非常有用。

像这样设置文件

NSData * data = [NSData dataWithContentsOfURL:...];
file.fileData = data;

要将数据写入文件,请使用

bool result = [file.fileData writeToURL:atomically:];

答案 2 :(得分:1)

要在设备之间同步核心数据,我建议您查看此网站,其中我已发布有关iOS和OS X应用的Core Data和iCloud集成的详细信息。这超出了本网站答案的范围。

http://ossh.com.au/design-and-technology/software-development/