2011-09-03 78 views
1

我一直在閱讀關於保存對象,保存狀態等信息,但我仍然對保存對象時應採取的路線有些困惑從我的應用程序創建。我已經構建了一個應用程序,用戶可以創建一個具有流派,名稱和頻率的電臺。一旦用戶點擊保存,就會使用自定義類創建「RadioStation」對象,並存儲在放置在RootViewController中的NSMutableArray中。雖然RadioStation對象可以存儲在這個數組中,並在表格視圖中正確顯示,但很明顯,一旦應用程序退出,應用程序就不再擁有這些對象。iOS:如何保存在應用程序中創建的自定義對象

在這一點上,我不知道我應該如何開始設計這個設計。我需要建立一個plist嗎?我應該使用SQLite數據庫的核心數據?我是否需要研究這兩種情況下的iOS對象序列化?還是有一種我不知道的更直接的方式?

+0

我已經添加了兩個答案,哪一個最適合你,可能取決於用戶將在應用程序中擁有多少個電臺。如果是10,我會用'NSCoding'去,如果它是5000,我會和Core Data一起去,但是如果它是50或100 ...那麼它不太清楚哪個更好。 –

+0

Plist文件和xml通常不會在iOS上使用。除非你壓縮它們,否則它們被認爲是浪費空間。但是壓縮這些文件使得它們不必要的慢讀/寫。 –

+2

@Abhi:在iOS上「沒有真正使用」?誰說的?我一直都在使用它們。 :)如果您正在討論實際的磁盤空間使用情況,那麼它們是一個很好的低開銷數據格式。它們可以以二進制格式存儲。只需直接使用'NSPropertyListSerialization'而不是方便的方法。 –

回答

6

最強大的方法是使您的自定義對象成爲NSManagedObject的一個子類,並使用核心數據將其存儲在NSManagedObjectContext中。在iOS上,這將始終使用sqlite數據庫,在Mac OS X上,您可以使用sqlite,xml或專有二進制格式(比xml更小/更快)。

根據數據結構的複雜程度以及未來可能發生的變化,這種技術可能對您的應用程序來說可能太複雜也可能不太複雜。設置需要很多工作,而且API非常複雜,但如果需要將數以萬計/數百萬個對象存儲在文件中,則這是最佳選擇。

對於您的應用程序,我會有一個包含應用程序中所有廣播電臺的sqlite文件。


最簡單的選擇是在自定義對象的類中實現NSCoding協議。這裏記載:

http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Archiving/Articles/codingobjects.html#//apple_ref/doc/uid/20000948-BCIHBJDE

的基本原理是你的對象寫入或所有它的數據讀取到一個「編碼器」,然後傳遞到任何子對象(或多個)編碼器。在課堂之外,您使用「存檔器」或「解析器」類來協調一切。

一旦您的自定義類實現NSCoding可以讀/它寫入磁盤:

myObject = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath]; 
[NSKeyedArchiver archiveRootObject:myObject toFile:filePath]; 

這是一個非常簡單的方法,但它有一些缺點,比如你需要弄清楚您自己的方式來支持不同版本的文件格式(例如可能使用不同的文件擴展名)。

許多類可可/ CocoaTouch已經實現了NSCoding,這樣他們就可以以這種方式(包括NSArrayNSStringNSNumber等)被寫入到文件中。

對於你的應用程序,我會用它來存儲每個電臺在一個單一的文件。當應用程序啓動時,從目錄加載所有電臺。您應該考慮爲您的應用啓用iTunes拖放文件共享功能,以便用戶可以輕鬆地與他們的朋友或設備之間共享無線電臺文件。

這也適合iCloud在設備之間進行同步,我還沒有看過iCloud,但我希望每個電臺的一個文件將是實現iCloud同步的理想方式。

+1

您應該編輯原始答案以添加此額外的詳細信息,而不是添加其他答案。 – Abizern

+0

@Abizem他們是兩個完全不同的答案,兩種有效的方法取決於問題中未提供的細節。你甚至讀過它們嗎? –

+0

請只使用一個答案,即使有多個解決方案。謝謝 – Kev

-1

不需要這樣的事情。如果你只有喜歡一個東西保存,然後研究的NSArray的這種方法:

- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag 

我你的用戶可以節省大量的電臺,那麼你可能想看看CoreData,其中有一個有點曲線,但最終將是最簡單的方法。

+1

這不適用於自定義對象。對於自定義對象,根據上述答案,NSCoding是正確的。 – Flyingdiver

+0

只使用屬性列表對象時,writeToFile/arrayWithContentsOfFile是非常有用的方法(https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/PropertyLists/Introduction/Introduction.html#// apple_ref/DOC/UID/10000048i)。 – Floydian

7

有三種方式在本地持久化數據:

  1. 庫對象在數據庫中使用各種班將writeToFile
  2. 存放在沙箱中使用文件管理對象或SQLite的
  3. 存儲對象NSUserDefaults中的數據

如何保存對象數據取決於您如何使用它以及保存的數據類型。如果你有很多相同類型的對象,並且SQL的搜索和排序機制會很有用,CoreData是有意義的。我傾向於使用沙盒來處理非常大的文件,例如圖像,聲音文件以及通過NSData反彈的大量數據聚集。我使用UserDefaults來處理可能被視爲「首選項」的少量數據。

您可以隨意放置任何地方,並且建議在開始新項目時熟悉所有三種機制。其他技術,例如使用NSCoding來序列化和反序列化類,可以用來簡化保存數據。請注意,一旦你實現了NSCoding,你可以在任何地方存儲數據,甚至可以通過網絡發送數據。

對於您的RadioStation,我會親自使用UserDefaults。使用NSCoding的好處是,一旦你實現了initWithCoder和encodeWithCoder,你就可以很容易地將對象層次結構(例如一個自定義對象數組,每個對象可能包含一個字典,數組或自定義對象)進行流式處理。如果你唯一保存的是一串字符串,那麼直接使用UserDefaults就足夠簡單了。

相關問題