我一直在阅读保存对象,保存状态等,但在保存从我的应用程序创建的对象时,我仍然对我应该采取的路线感到困惑。我已经构建了一个应用程序,用户可以使用类型,名称和频率创建一个无线电台。一旦用户点击保存,就会使用自定义类创建“RadioStation”对象,并将其存储在放置在RootViewController中的NSMutableArray中。虽然RadioStation对象可以存储在此数组中并在表视图中正确显示,但很明显,一旦应用程序退出,应用程序将不再保留这些对象。
此时我不确定如何开始设计这个设计。我需要设置一个plist吗?我应该将Core Data与SQLite DB一起使用吗?我是否需要针对这两种情况研究iOS对象序列化?还是有一种我不知道的更直接的方式?
答案 0 :(得分:7)
有三种方法可以在本地保存数据:
如何保留对象数据取决于您使用它的方式以及您要保存的数据类型。如果你有很多相同类型的对象,并且SQL的搜索和排序机制会很有用,那么CoreData是有意义的。我倾向于将沙盒用于非常大的文件,例如图像,声音文件以及通过NSData反弹的大量数据。我将UserDefaults用于可能被视为“首选项”的少量数据。
您可以随意放置任何内容,我建议您在开始新项目时熟悉所有这三种机制。其他技术(如使用NSCoding序列化和反序列化类)可用于简化数据保存。请注意,一旦实施了NSCoding,您就可以在任何地方存储数据,甚至可以通过网络发送数据。
对于您的RadioStation,我个人会使用UserDefaults。使用NSCoding的好处是,一旦实现了initWithCoder和encodeWithCoder,就可以非常轻松地流式传输对象层次结构(例如,自定义对象数组,每个对象可能包含字典,数组或自定义对象等)。如果您保存的唯一内容是字符串数组,那么直接使用UserDefaults就足够了。
答案 1 :(得分:6)
最强大的方法是使自定义对象成为NSManagedObject
的子类,并使用Core Data将其存储在NSManagedObjectContext
中。在iOS上,这将始终使用sqlite数据库,在Mac OS X上,您可以使用sqlite,xml或专有的二进制格式(比xml更小/更快)。
根据您的数据结构的复杂程度以及将来更改的可能性,此技术可能会对您的应用程序造成太复杂的影响。设置需要做很多工作,API非常复杂,但如果你需要在文件中存储数万/数百万个对象,它是最好的选择。
对于您的应用,我会有一个包含应用中所有电台的sqlite文件。
最简单的选择是在自定义对象的类中实现NSCoding
协议。记录在这里:
基本理论是您的对象将所有数据写入或读取到“编码器”,然后将编码器传递给任何子对象。在课堂之外,你使用“archiver”或“unarchiver”类来协调一切。
自定义类实现NSCoding
后,您可以使用以下命令将其读取/写入磁盘:
myObject = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
[NSKeyedArchiver archiveRootObject:myObject toFile:filePath];
这是一种非常简单的方法,但它有一些缺点,例如,您需要找出自己的方式来支持不同版本的文件格式(例如,可能使用不同的文件扩展名)。
Cocoa / CocoaTouch中的许多类已经实现NSCoding
,因此可以这种方式将它们写入文件(包括NSArray
,NSString
,NSNumber
等)
对于您的应用,我会用它将每个广播电台存储在一个文件中。应用程序启动时,从目录中加载所有无线电台。您应该考虑为您的应用启用iTunes拖放文件共享,这样用户就可以轻松地与朋友或设备之间共享广播电台文件。
这也适合iCloud在设备之间进行同步,我没有多看iCloud,但我希望每个广播电台有一个文件是实现iCloud同步的理想方式。
答案 2 :(得分:-1)
不需要这样的东西。如果您只想保存一件事,那么请研究NSArray的这种方法:
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag
我的用户可以保存很多广播电台,那么您可能需要查看CoreData,它有一点曲线,但最终将是最简单的方法。