带包的Cocoa应用程序框架

时间:2009-10-26 22:18:35

标签: cocoa sqlite frameworks document

好的,我在Cocoa中创建了一个基于文档的应用程序,文档的文件类型实际上是一个包。在该包中包含XML设置文件,SQLite数据库和在运行时下载的zip文件。现在唯一真正改变的是XML设置文件,因为其他文件可以在运行时重新创建。

这些包中的每一个都只有一个窗口,因此我希望使用基于文档的。这些文件也可以像任何其他文件一样被复制,重命名,移动等。

但我完全迷失了如何在文档框架中实现这一点!似乎无处不在,我在文档中看到它总是在讨论文件的内存表示,然后使用在NSDocument覆盖之一中呈现给您的路径写出来(因为Cocoa可能会移动它等等)但是我再一次使用位于磁盘上而不是内存中的SQLite数据库。

我已经查看了所有可覆盖的方法,这些方法仍然会给我提供诸如doc的脏状态检查,打开和保存文件对话框支持等等,但我似乎找不到任何只是说'这里'的东西一个文件URL ...按照你认为合适的方式打开它'虽然我确实接近了应用程序的委托级别,至少在开放时是这样。

所以让我们假设它按预期工作。如何实现保存/保存 - 我想要控制写入磁盘的所有内容?我不想(我不能)搞乱数据结构等。我只是希望得到一个用户在“另存为”对话框中选择的psth(对于新的)并且能够写出我需要的内容。简单。但同样,developer.apple.com关于基于文档的体系结构的50多页文档告诉我在哪里重载很多东西,但每一个似乎都源于文档的一些内存表示,而这又不是我的包裹是什么。从技术上讲,只有内部XML文件才能与文档绑定。其他一切都只是对它的支持。

所以?任何人?接受者?

标记

3 个答案:

答案 0 :(得分:2)

  

我似乎无法找到任何只是说“这是一个文件网址......按照你认为合适的方式打开”

在文档类中实现the readFromURL:ofType:error: method。或者,由于您的文档类型是包类型,请实现the readFromFileWrapper:ofType:error: method

您不必将数据读入内存;无论您实施哪种方法,都可以随心所欲,包括打开数据库。

  

如何实现保存/保存 - 我想控制写入磁盘的所有内容?

实施the writeToURL:ofType:error: methodthe fileWrapperOfType:error: method

如果您已经或可以轻松地在内存中创建数据,那么您将实施readFromData:ofType:error:dataOfType:error:方法。基于URL和基于文件包装器的方法适用于内存中的数据不是选项的情况。文件包装器的主要用途是用于像你这样的包类型。

答案 1 :(得分:1)

实际上,我发现了它。它不是'writeTo'方法,而是你要覆盖的'saveTo'方法。当我这样做时,保存代码按预期工作,包括自动保存面板支持。为清楚起见,这是我选择的那个......

saveToURL:ofType:forSaveOperation:错误:

它就像一个冠军!现在不太混乱,是吧!啧!!!

答案 2 :(得分:0)

这当然是我尝试过的第一件事,但是如果你阅读开发者文档 - 特别是基于Cocoa文档的架构 - 这就是关于那些方法的说法......

  

在写作过程中,可能会要求您的文档将其内容写入其他位置或使用其他文件类型。同样,重写的方法应该能够确定从传入的参数进行写入所需的一切。

     

如果您的覆盖无法从传入的参数中确定所需的所有信息,请考虑覆盖其他方法。例如,如果您发现需要从readFromData:ofType:error:的覆盖中调用fileURL,则可能应该覆盖readFromURL:ofType:error:。再举一个例子,如果你看到需要在writeToURL:ofType:error:的覆盖中调用fileURL,也许你应该覆盖writeToURL:ofType:forSaveOperation:originalContentsURL:error:。

换句话说,它似乎说你不能假设传递给你的URL是最终写入'某事'的磁盘上的实际位置,这在处理数据库文件时会造成严重破坏。通过URL打开。也许我错过了什么。

但是好吧......忘了我读过它,甚至只是尝试覆盖那些方法。我这样做,并为每个返回TRUE(我记录URL,以便我可以看到传入的内容),在选择文件名后,我在“另存为”时收到此错误...

2009-10-28 14:31:51.548 XPanel[1001:a0f] dataOfType:error: is a subclass responsibility but has not been overridden.

...但是当您查看文档时,它说默认实现会抛出异常,因为您必须覆盖上面的其他实现之一......我显然只是这样做了!此外,再次,这不能表示为简单的数据!

所以在这里抓住稻草,我也把它覆盖了,只是返回了nil,再次,你不能代表我正在用NSData对象做什么。然后我收到一条“无法保存”的消息。

WTF?无论如何它为什么要调用那个东西?!!

......当我放弃并在此发布时,就是这样。

现在,如果你能给我一个简单的例子,甚至可能实际上没有读取或写入文件,而只是记录URL,那将是完美的。不是有用,但仍然,它应该工作......我似乎无法实现得到它。