iOS:如何保存在应用程序中创建的自定义对象

我一直在阅读保存对象,保存状态等,但在保存从我的应用程序创建的对象时,我仍然对我应该采取的路线感到困惑。 我已经构建了一个应用程序,用户可以使用类型,名称和频率创建一个无线电台。 一旦用户点击保存,就会使用自定义类创建“RadioStation”对象,并将其存储在放置在RootViewController中的NSMutableArray中。 虽然RadioStation对象可以存储在此数组中并在表视图中正确显示,但很明显,一旦应用程序退出,应用程序将不再保留这些对象。

在这一点上,我不确定如何开始构建这个设计。 我需要设置一个plist吗? 我应该将Core Data与SQLite DB一起使用吗? 我是否需要针对这两种情况研究iOS对象序列化? 还是有一种我不知道的更直接的方式?

最强大的方法是使您的自定义对象成为NSManagedObject的子NSManagedObject ,并使用Core Data将其存储在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

基本理论是您的对象将所有数据写入或读取到“编码器”,然后将编码器传递给任何子对象。 在课堂之外,你使用“archiver”或“unarchiver”类来协调一切。

一旦您的自定义类实现了NSCoding您就可以使用以下命令将其读/写到磁盘:

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

这是一种非常简单的方法,但它有一些缺点,例如,您需要找出自己的方式来支持不同版本的文件格式(例如,可能使用不同的文件扩展名)。

Cocoa / CocoaTouch中的许多类已经实现了NSCoding ,因此可以以这种方式将它们写入文件(包括NSArrayNSStringNSNumber等)。

对于您的应用程序,我将使用它将每个广播电台存储在一个文件中。 应用程序启动时,从目录加载所有无线电台。 您应该考虑为您的应用启用iTunes拖放文件共享,以便用户可以轻松地与朋友或设备之间共享广播电台文件。

这也适合与iCloud在设备之间进行同步,我没有多看过iCloud,但我希望每个广播电台有一个文件是实现iCloud同步的理想方式。

有三种方法可以在本地保存数据:

  1. 使用托管对象或SQLite将对象存储在数据库中
  2. 使用各种类的writeToFile将对象存储在沙箱中的文件中
  3. 将数据存储在NSUserDefaults中

如何保留对象数据取决于您使用它的方式以及您要保存的数据类型。 如果你有很多相同类型的对象,并且SQL的搜索和排序机制会很有用,那么CoreData是有意义的。 我倾向于将沙箱用于非常大的文件,例如图像,声音文件以及通过NSData反弹的大量数据。 我将UserDefaults用于可能被视为“首选项”的少量数据。

你可以把任何东西放在任何你想要的地方,我建议你在开始一个新项目时熟悉这三种机制。 其他技术(如使用NSCoding序列化和反序列化类)可用于简化数据保存。 请注意,一旦实施了NSCoding,您就可以将数据存储在任何地方,甚至可以通过网络发送。

对于您的RadioStation,我个人会使用UserDefaults。 使用NSCoding的好处是,一旦实现了initWithCoder和encodeWithCoder,就可以非常轻松地流式传输对象层次结构(例如,自定义对象数组,每个对象可能包含字典,数组或自定义对象等)。 如果您要保存的唯一内容是字符串数组,那么直接使用UserDefaults就足够了。

不需要这样的东西。 如果您只想保存一件事,那么研究NSArray的这种方法:

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

我的用户可以保存很多电台,那么你可能想要查看CoreData,它有一点曲线,但最终将是最简单的方法。