在iPhone上保留XML文件的最佳方法?

时间:2010-09-17 19:53:23

标签: iphone file-io xamarin.ios

我正在使用MonoTouch和System.Data来创建一个DataSet(对于那些不熟悉的人来说只是xml),用于简单的数据绑定。我的应用程序上的数据很少,因此无需全力以赴使用SQLLite。使用数据集可以轻松通过Web服务传递云同步。

我在保存时将DataSet序列化到个人文件夹,当然在应用程序启动时读取此文件以加载用户的数据。我有问题这个文件变得腐败,我不知道为什么。我假设这些设备上的文件I / O可能很慢,这可能是原因,我不确定,但它正在发生。

我还担心当用户将他们的设备与iTunes同步时,iTunes可能会在PC / MAC之间来回传递此文件,这可能是导致损坏的原因?

我想阻止此设备文件与iTunes同步,并且可靠地保留它。我正在使用NSFile.Save选项将其保存到设备。我在想,因为它是一个文本文件,我可以更安全地将它存储在标准用户设置区域中吗?我认为这会阻止它被itunes同步?

为xml数据集存储处理此文件i / o的最可靠和最安全的方法是什么?

谢谢。

4 个答案:

答案 0 :(得分:2)

您正在使用MonoTouch。是不是只是调用DataSet.WriteXml()与FileStream对象准备写入Documents文件夹中的文档?

该文档文件夹已备份到iTunes。它没有被同步,但如果你的用户正在恢复他们的手机(因为他们把它搞砸了,丢失了,等等)它会有所帮助。它没有解释为什么它会腐败。

我唯一可以想到它腐败的原因是因为你的应用程序花了很长时间才能写出它。从用户退出应用程序到关闭应用程序的时间有限,以防止应用程序将系统保留为人质并恶化用户体验。

如果编写整个数据集的时间太长,您需要考虑将其最小化。也许您只能存储数据,而不是架构。或者,您可以设计一种方法,在退出时仅存储增量,并在用户再次加载应用时进行协调。

您还可以通过写入第二个文件来防止数据完全丢失,并在该操作完成后删除旧文件并重命名。这样,下次启动时如果写操作没有完成,旧文件仍然存在,用户只会丢失最近的更改。

在任何情况下,如果您的数据太大而无法完成简单的写操作,您应该查看不同的选项,例如sqlite。

答案 1 :(得分:2)

最好的办法是将XML保存为文本。它就像File.WriteAllText(...)一样简单 - 没有理由去NSFile。这是MonoTouch优势的一部分:)

关于同步,这是规则:

  • 如果您将文件保存在用户的文档文件夹中(Environment.SpecialFolder.MyDocuments和Environment.SpecialFolder.Personal BOTH指向用户的doc文件夹),那么只要用户与iTunes同步,它就会被备份。

这没什么不对。它会在会话之间保留数据,并且如果用户手机出现问题并且需要从备份恢复,则可以恢复。由于您的问题是关于持久手机上的XML文件,这就是您想要的。

至于iTunes问题,速度和同步没有问题,因为在手机同步时你的应用程序不会运行。该文件将被保存或不保存。当您的应用正在运行时正在发生任何损坏

文件损坏的原因可能包括:

  • 在用户退出之前不保存。你有机会这样做。

  • 未妥善处理来电。系统也会对此发出警告。

iTunes肯定不会破坏您的文件。如果是这种情况,iOS应用程序将全部破坏。无论出于何种原因,它可能会在您的开发机器上发生,但我从未在其他地方看到过这种情况,并且我已经完成了相当多的iOS开发。

如果你想要阅读和撰写文件的教程,我发布了an answer in another question

这很冗长,但关键是尽可能多地回答问题,这样就没有人会被抛弃或混淆。

关于iOS设备的一个好处是,你可以在一人一个世界中回归(对于大多数应用程序而言)。您正在编写应用程序,您不必担心同时尝试使用基于Web的应用程序的5,000人(这并非总是如此,但是......您明白了这一点)。因此,您可以执行通常认为对性能不利的事情,但是您不太可能看到任何性能问题(只要您保存的文件小到可以快速保存或者您正在保存在另一个线程的后台 - 你永远不想用繁重的IO操作来阻止主(UI)线程。)

如果您还有其他问题,请随时提出。

我希望这会有所帮助:)

答案 2 :(得分:0)

许多框架都是只读的,但我发现来自http://code.google.com/p/gdata-objectivec-client/的GDataXMLNode可以很好地读/写。

话虽如此,在iPhone上使用带有SQLLite后端的Core Data会让你自己受到青睐。 :-) Apple为您完成了所有这些并且比我们任何人都更优化它

干杯

的Nik

答案 3 :(得分:0)

考虑使用SQLite,我会选择像

这样的东西

entify - 如果它按照它说的那样做 - 看起来真的很好。

在iPhone上持久存储XML作为存储和访问数据的方法是一个你不想进入的错误。我在这里写了http://iwayneo.blogspot.com/2010/08/festival-star-history-serialization-as.html