2010-09-17 124 views
3

我正在使用MonoTouch和System.Data創建一個DataSet(只是xml對那些不熟悉的)簡單的數據綁定。我的應用程序數據很少,因此不需要全部使用SQLLite。使用數據集可以輕鬆地通過Web服務傳遞雲同步。在iPhone上保存XML文件的最佳方法?

我將DataSet序列化到保存的個人文件夾,當然應用程序啓動時會讀取此文件以加載用戶的數據。我遇到了這個文件變得腐敗的問題,我不知道爲什麼。我認爲這些設備上的文件I/O可能會很慢,這可能是原因,我不確定,但是它正在發生。

我還擔心iTunes可能會在用戶將其設備與iTunes同步時在PC/MAC之間來回傳遞此文件,這可能是導致損壞的原因?

我想阻止這個設備文件與iTunes同步,並且可靠地保存它。我正在使用NSFile.Save選項將其保存到設備。我在想,因爲這是一個文本文件,也許我可以更安全地將其存儲在標準的用戶設置區域呢?這會阻止它被iTunes同步,我猜?

什麼是最可靠和安全的方式來處理這個文件I/O的XML數據集存儲?

謝謝。

+0

你用什麼路徑來存儲文檔?你有沒有閱讀[這些](http://wiki.monotouch.net/HowTo/Files/HowTo%3a_Store_Files)存儲文件的指南? – Jason 2010-09-17 21:13:43

回答

2

您使用MonoTouch的。是不是簡單地調用DataSet.WriteXml()與FileStream對象準備寫入到文檔文件夾中的文檔?

將Documents文件夾備份到iTunes。它沒有同步,但是如果你的用戶正在恢復他們的電話(因爲他們堵塞了它,丟失了它),這會有所幫助。這並不能解釋爲什麼它是腐敗的。

我能想到它爲什麼會損壞的唯一原因是您的應用程序花了太長時間來編寫它。用戶從應用程序退出應用程序直到關閉應用程序的時間有限,以防止應用程序將系統保留爲人質並惡化用戶體驗。

如果編寫整個數據集的時間太長,您需要考慮將其最小化。也許你可以只存儲數據,而不是模式。或者,您可以設計一種方法,只在退出時存儲增量,並在用戶再次加載應用時進行協調。

您還可以通過寫入第二個文件來防止完全丟失數據,並且在該操作完成時刪除舊文件並重命名。這樣,如果寫入操作未完成,下次啓動時,舊文件仍然存在,用戶只會失去其最近的更改。

在任何情況下,如果您的數據變得太大而無法完成簡單的寫入操作,您應該查看不同的選項,如sqlite。

0

很多框架是隻讀的,但我發現http://code.google.com/p/gdata-objectivec-client/的GDataXMLNode的讀寫性能很好。

話雖如此,在iPhone上,你會爲使用Core Data和SQLLite後端做一個大忙。 :-)蘋果已經做的一切都是爲了你和優化其超過每就會

乾杯我們任何

0

考慮使用SQLite,我會去像

entify - 如果它做到了它所說的那樣 - 看起來非常好。

在iPhone上持續使用XML作爲存儲和訪問數據的手段是一種你不想進入的惡念。我在這裏寫了它http://iwayneo.blogspot.com/2010/08/festival-star-history-serialization-as.html

+0

在Entify論壇的評論中說,它只能與模擬器一起使用,而不能與已部署的設備一起使用。有沒有人驗證它的作品? – tbischel 2010-10-20 23:38:20

2

最好的辦法是將XML保存爲文本。它就像File.WriteAllText(...)一樣簡單 - 沒有理由去NSFile這個。這就是MonoTouch的:)

關於同步的優勢的一部分,這裏的規則:

  • 如果你一直在用戶的文檔文件夾(Environment.SpecialFolder.MyDocuments文件和Environment.SpecialFolder.Personal都指向到用戶的doc文件夾),那麼只要用戶與iTunes同步,它就會得到備份。

這沒有什麼錯。它在會話之間保存數據,並在用戶電話出現問題並且需要從備份恢復時恢復數據。由於您的問題是關於堅持手機上的XML文件,這就是你想要的。

至於iTunes問題,速度和同步沒有問題,因爲您的應用在電話同步時不會運行。該文件將被保存或不會。在您的應用運行時發生的任何損壞發生在

理由越來越損壞,包括文件:

  • 用戶退出前不保存。你有機會做到這一點。

  • 沒有優雅地處理傳入的電話。系統也會警告您。

iTunes絕對不會損壞您的文件。如果是這樣的話,iOS應用程序將全部被破壞。無論出於何種原因,它可能會在您的開發機器上發生,但我從未在其他地方看到過這種情況,並且我已經完成了相當多的iOS開發。

如果你想閱讀和寫作文件的教程,我張貼an answer in another question

這很長,但重點是要回答儘可能多的問題,這樣就不會有人留下任何懸念或困惑。

關於iOS設備的一個好消息是,你在一個人的世界裏回來了(對於大多數應用)。你正在編寫的應用程序,你不必擔心5000人同時嘗試使用基於Web的應用程序(這並非總是如此,但是......你明白了)。因此,您可以執行通常認爲性能不佳的事情,但您不可能看到任何性能問題(只要您保存的文件足夠小以便快速保存或保存在另一個線程的後臺 - 你永遠不想用繁重的IO操作來阻塞主(UI)線程)。

如果您有任何問題,請隨時詢問。

我希望這有助於:)

+0

謝謝Rory。我正在使用DataSet.WriteXml和.ReadXml方法。我將改變一些東西,只保留數據,而不是模式,然後在應用程序運行時合併數據。這將節省一些時間。 – Neal 2010-09-28 13:04:52