标签:
iOS应用数据存储的常用方式
一、XML属性列表(plist)归档----缺点:不能存储自定义对象
*plist只能存储系统自带的一些常规的类,也就是有writeToFile方法的对象才可以使用plist保存数据,如字符串/字典/数组/NSNumber/NSData ...,
*因为需要获取路径,所以较麻烦
二、Preference(偏好设置)----缺点:不能存储自定义对象
*偏好设置是专门用来保存应用程序的配置信息的,一般情况下不要在偏好设置中保存其他数据。
*如果利用系统的偏好设置来存储数据,默认就是存储在Preferences文件夹下面的。*偏好设置会将所有的数据保存到同一个文件中。
*本质上还是plist(即不能存储普通对象),只是将获取路径的操作封装起来了
三、NSKeyedArchiver归档(NSCoding)
1.自定义一个类NJPerson,并声明name属性,age属性,height属性
2.在故事板上拖2个按钮,保存对象和读取对象,并监听这2个按钮(拖线)
3.在控制器实现文件中导入NJPerson.h,并实现这2个方法
-(IBAction)saveBtnClick:(id)sender{
//1.创建对象
NJPerson *p = [[NJPerson alloc] init];
p.name = @”lnj“;
p.age = 28;
p.height = 1.76;
//2.获取文件路径
NSString *docPath = NSSerachPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) lastObject];
NSString *path = [docPath stringByAppendingPathComponent:@"person.arc"];
//3.将自定义对象保存到文件中
[NSKeyedArchiver archiveRootObject:p toFile:path];
}
-(IBAction)readBtnClick:(id)sender{
//1.获取文件路径
NSString *docPath = NSSerachPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) lastObject];
NSString *path = [docPath stringByAppendingPathComponent:@"person.arc"];
[NSKeyedArchiver archiveRootObject:p toFile:path];
//2.读取数据
NJPerson *p = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
}
NSLog(@"%@ %d %.1f",p.name,p.age,p.height);
4.在NJPerson.h中遵守NSCoding协议(如果想将一个自定义对象保存到文件中必须实现NSCoding协议)
在NJPerson.m中实现encodeWithCoder:方法和initWithCoder:
//当将一个自定义对象保存到文件的时候就会调用该方法
//在该方法中说明如何存储自定义对象的属性
//也就是说在该方法中说清楚存储自定义对象的哪些属性
-(void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject:self.name forKey:@"name"];
[encoder encodeInteger:self.age forKey:@"age"];
[encoder encodeFloat:self.height forKey:@"height"];
}
//当从文件中读取一个对象的时候就会调用该方法
//在该方法中说明如何读取保存在文件中的对象
//也就是说在该方法中说清楚怎么读取文件中的对象
-(id)initWithCoder:(NSCoder *)decoder
{
if(self = [super init]){
self.name = [decoder decodeObjectForKey:@"name"];
self.age= [decoder decodeObjectForKey:@"age"];
self.height= [decoder decodeObjectForKey:@"height"];
}
return self;
}
完整逻辑:
点击保存对象按钮 --> 执行saveBtnClick:方法(创建对象,获取文件路径,将自定义对象保存到文件中) --> [NSCoding协议]执行encoderWithCoder:方法
点击读取对象按钮 --> 执行readBtnClick:方法(获取文件路径,从文件中读取对象) --> [NSCoding协议]执行initWithCoder:方法
继承
1.新建一个类NJStudent,继承自NJPerson
2.在其头文件中声明一个weight属性
3.改成创建NJStudent对象,但是想要保存和读取weight属性,必须要在NJStudent.m文件中重新实现encodeWithCoder:和initWithCoder:,说清楚如何保存和如何读取。
4.如果既想保存子类特有的,又想保存父类也有的,那么在子类的encodeWithCoder:方法中加入[super encodeWithCoder:aCoder];即可。
5.如果既想读取子类特有的,又想读取父类也有的,那么在子类的initWithCoder:方法中改成if(self = [super initWithCoder:aDecoder])即可。
四、SQLite3
五、Core Data
标签:
原文地址:http://www.cnblogs.com/marshall-yin/p/4715419.html