2011-09-03 79 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就足够简单了。

相关问题