目前在ios开发中,实现数据持久化的方法主要由四种,分别为属性列表、归档、数据库、Core Data,下面我就给大家简单介绍一下他们的用法
一、属性列表
主要用到的类:NSUserDefaults,下面我建一个User类
@interface User :NSObject<NSCoding>//首先要遵守NSCoding协议
@property (nonatomic,assign)NSInteger userID;
@property (nonatomic,copy)NSString *name;
@end
使用方法
1.将属性分开存储
//存入对象(将id、name分开存储)
[[NSUserDefaultsstandardUserDefaults]setInteger:userIDforKey:@"userID"];
[[NSUserDefaultsstandardUserDefaults]setObject:nameforKey:@"name"];
//取出对象
NSInteger uid = [[NSUserDefaultsstandardUserDefaults]integerForKey:@"userID"];
NSString* name = [[NSUserDefaultsstandardUserDefaults]stringForKey:@"name"];
2.按对象存取
// 存入User对象
[[NSUserDefaultsstandardUserDefaults]setObject:selfforKey:@"user"];
// 取出User对象
User *user = [[NSUserDefaultsstandardUserDefaults]objectForKey:@"user"];
二、归档
使用归档,要遵循NSCoding协议,实现下边的两个方法:
// 以下两个方法一定要实现,不然在调用的时候会crash
#import "User.h"
@implementation User
- (instancetype)initWithName:(NSInteger)uid name:(NSString *)name
{
self = [superinit];
if (self) {
self.name = name;
self.userID = uid;
}
returnself;
}
/**
此处需要注意的是,编码和解码时的key必须是一致的,要不然取不到内容
**/
//编码
- (void)encodeWithCoder:(NSCoder *)aCoder
{
// [aCoder encodeObject:[NSNumber numberWithInt:self.userID] forKey:@"uid"];//也可以将NSInteger转换成NSNumber类型的
[aCoder encodeInteger:self.userIDforKey:@"uid"];
[aCoderencodeObject:self.nameforKey:@"name"];
}
//解码
- (id)initWithCoder:(NSCoder *)aDecoder
{
// NSInteger userId = [[aDecoder decodeObjectForKey:@"uid"] integerValue];//和上边的方法要对应
NSInteger userId = [aDecoder decodeIntegerForKey:@"uid"];
NSString *name = [aDecoder decodeObjectForKey:@"name"];
return [selfinitWithName:userId name:name];
}
@end
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES)objectAtIndex:0];
filePath = [documentsPathstringByAppendingPathComponent:@"kkk.txt"];
//归档类(即存储对象)
User *user = [[Useralloc] initWithUid:1name:@"张华"];
NSMutableData *data = [[NSMutableDataalloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiveralloc] initForWritingWithMutableData:data];
[archiver encodeObject:userforKey:@"user"];//此时会执行user的encodeWithCoder:方法
[archiverfinishEncoding];//结束编码(归档完毕后)
[data writeToFile:filePathatomically:YES];//存入沙盒中的某个文件下
//反归档(即取出对象)
NSData *data1 = [NSDatadataWithContentsOfFile:filePath];
NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiveralloc] initForReadingWithData:data1];
User *user1 = [unArchiver decodeObjectForKey:@"user"];//此时会执行p1的initWithCoder:方法
NSLog(@"%d %@",user1.userID,user1.name);
大家可以去数据库的那篇文章去看,我个人认为写的还是蛮详细的。
四、Core Date
Core Date内容比较多,我会在下篇文章中和大家分享,希望上边写的对大家能有帮助。