先发一个练手的小demo,自己写的简略通讯录,已上传至github
https://github.com/liaoshaolim/addressBook
1.NSKeyedArchiver:(归档)
这里用一个添加联系人的例子来说明:
注意:归档形式保存数据,需要该对象遵守NSCoding协议,而且对应的必须提供encodeWithCoder和initWithCoder方法
因为归档是一次性的,解压也是一次性的,所以小量的ok,如果量大的话,改一个小地方就要归档或解压全部,效率会比较低
//用一个宏来定义存储路径(较好的设计) #define ContactFilePath [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"contacts.data"] //归档,这里是存储了一个联系人对象的数组 [NSKeyedArchiver archiveRootObject:self.contactArr toFile:ContactFilePath]; //读数据,也是读取数组 _contactArr = [NSKeyedUnarchiver unarchiveObjectWithFile:ContactFilePath];
@interface ContactModel : NSObject<NSCoding> @property(nonatomic,copy)NSString* name; @property(nonatomic,copy)NSString* phone; @end #import "ContactModel.h" @implementation ContactModel //将某个对象写入文件时候会被调用 //在这个方法中需要说明哪些属性需要存储。 - (void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeObject:_name forKey:@"name"]; [aCoder encodeObject:_phone forKey:@"phone"]; } //解析对象的时候会被调用 //需要说明需要解析哪些属性 - (id)initWithCoder:(NSCoder *)aDecoder { if (self = [super init]) { _name = [aDecoder decodeObjectForKey:@"name"]; _phone = [aDecoder decodeObjectForKey:@"phone"]; } return self; } @end
2.NSUserDefaults:
用来保存应用程序设置和属性、用户保存的数据
用户再次打开程序或开机后这些数据仍然存在
NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。如果要存储其他类型,则需要转换为前面的类型,才能用NSUserDefaults存储
#define UserNameKey @"name" #define PwdKey @"pwd" #define RemeberPwdKey @"remeber_pwd" NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setObject:_nameField.text forKey:UserNameKey]; [userDefaults setObject:_pwdField.text forKey:PwdKey]; [userDefaults setBool:_remeberSwitch.isOn forKey:RemeberPwdKey]; [userDefaults synchronize];//用synchronize方法把数据持久化到standardUserDefaults数据库 NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];//可以看出来,这是一个单例模式 _remeberSwitch.on = [userDefaults boolForKey:RemeberPwdKey]; if (_remeberSwitch.isOn) { _pwdField.text = [userDefaults valueForKey:PwdKey]; _loginBtn.enabled = true; }
3.写到磁盘
①:获得文件即将保存的路径:
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);//这三个参数几乎一直是这样的
NSString *ourDocumentPath =[documentPaths objectAtIndex:0];//建议还是用宏来表示
还有一种方法是使用NSHomeDirectory函数获得sandbox的路径。
具体的用法为:NSString *sandboxPath = NSHomeDirectory();
不能在sandbox的本文件层上写文件也不能创建目录,而应该是此基础上创建一个新的可写的目录,例如Documents,Library或者temp。
NSString *documentPath = [sandboxPath
stringByAppendingPathComponent:@"Documents"];//将Documents添加到sandbox路径上,具体原因前面分析了!
这两者的区别就是:使用NSSearchPathForDirectoriesInDomains比在NSHomeDirectory后面添加Document更加安全。因为该文件目录可能在未来发送的系统上发生改变。
②:生成在该路径下的文件:
NSString *FileName = [ourDocumentPath stringByAppendingPathComponent:@"myFile"];
③:往文件中写数据:
NSData data1 = ...
[data writeToFile:FileName atomically:YES];//将NSData类型对象data写入文件,文件名为FileName
④:从文件中读数据:
NSData data2 = [NSData dataWithContentsOfFile:FileName options:0 error:NULL];//从FileName中读取出数据
4. SQLite
SQLite作为一中小型数据库,应用ios中,跟前三种保存方式相比,相对比较复杂一些。
这里推荐一个第三方库 FMDB
这里直接贴上一大神的总结http://blog.devtang.com/blog/2012/04/22/use-fmdb/
5.core data
这个目前用的不多,等以后总结出来再补上来。如果有熟悉的大神,欢迎交流!
iOS 学习笔记——0005(数据存储)