您的位置:首页 > 移动开发 > IOS开发

iOS 的几种数据持久化方案

2015-07-21 10:52 337 查看
引用:http://www.cocoachina.com/ios/20150720/12610.html

//************************沙盒************************

//应用程序包,里面存放的是应用程序的源文件,包括资源文件和可执行文件

NSString *path=[[NSBundle
mainBundle]bundlePath];

NSLog(@"%@",path);

//Documents
最常用的目录,iTunes同步应用时会同步此文件夹中的内容,适合存储重要的数据

NSString *document_path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES).firstObject;

NSLog(@"%@",document_path);

//Library/Caches:iTunes
不会同步此文件夹,适合存储体积大,不需要备份的非重要数据

NSString *library_path=NSSearchPathForDirectoriesInDomains(NSCachesDirectory,
NSUserDomainMask, YES).firstObject;

NSLog(@"%@",library_path);

//library/Preferences:iTunes同步应用时会同步此文件夹中的内容,通常保存应用的设置信息

//tmp:iTunes不会同步次文件夹,系统可能在应用没有运行时就删除该目录下的文件,所以此目录适合保存应用中的一些临时文件,用完就删除

NSString *tmp_path=NSTemporaryDirectory();

NSLog(@"%@",tmp_path);

//**********************plist******************

//plist文件
是将某些特定的类,通过XML文件的方式保存在目录中

//可以被序列化的类型只有如下几种:NSArray,NSMutableArray,NSDictionary,NSMutableDictionary,NSData,NSMutableData,NSString,NSMutableString,NSNumber,NSDate

//1.获得文件路径

NSString *plist_path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES).firstObject;

NSString *fileName=[plist_path
stringByAppendingString:@"alta.plist"];

//2.存储

NSArray *array=@[@"123",@"456",@"789"];
[array
writeToFile:fileName
atomically:YES];

//3.读取

NSArray *result=[NSArray
arrayWithContentsOfFile:fileName];

NSLog(@"%@",result);

/*只有以上列出的类型才能使用plist文件存储。

存储时使用writeToFile: atomically:方法。
其中atomically表示是否需要先写入一个辅助文件,再把辅助文件拷贝到目标文件地址。这是更安全的写入文件方法,一般都写YES。

读取时使用arrayWithContentsOfFile:方法。*/

//*******************Preference*****************

//1.使用方法

//1.获得NSUserDefaults文件

NSUserDefaults *userDefaults=[NSUserDefaults
standardUserDefaults];

//2.向文件中写入内容
[userDefaults
setObject:@"Alta"
forKey:@"name"];
[userDefaults
setObject:@"girl"
forKey:@"sex"];
[userDefaults
setInteger:23
forKey:@"age"];

//立即同步
[userDefaults
synchronize];

//3.读取文件

NSString *name=[userDefaults
objectForKey:@"name"];

NSString *sex=[userDefaults
objectForKey:@"sex"];

NSInteger age=[userDefaults
integerForKey:@"age"];

NSLog(@"her name is %@,is a %@,age %@",name,sex,@(age));

/*偏好设置是专门用来保存应用程序的配置信息的,一般不要在偏好设置中保存其他数据。

如果没有调用synchronize方法,系统会根据I/O情况不定时刻地保存到文件中。所以如果需要立即写入文件的就必须调用synchronize方法。

偏好设置会将所有数据保存到同一个文件中。即preference目录下的一个以此应用包名来命名的plist文件。*/

//*****************NSKeyedArchiver************

//归档在IOS中是另一种形式化的序列化

NSCoding协议声明了两个方法,这两个方法都是必须实现的。一个用来说明如何将对象编码到归档中,另一个说明如何进行解档来获取一个新对象。

遵循协议和设置属性

//1.遵循NSCoding协议

@interface Person : NSObject
//2.设置属性

@property (strong, nonatomic) UIImage *avatar;

@property (copy, nonatomic) NSString *name;

@property (assign, nonatomic) NSInteger age;

@end

实现协议方法

//解档
- (id)initWithCoder:(NSCoder *)aDecoder {

if ([super init]) {

self.avatar = [aDecoder decodeObjectForKey:@"avatar"];

self.name = [aDecoder decodeObjectForKey:@"name"];

self.age = [aDecoder decodeIntegerForKey:@"age"];
}

return self;
}

//归档
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:self.avatar forKey:@"avatar"];
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:self.age forKey:@"age"];
}

特别注意

如果需要归档的类是某个自定义类的子类时,就需要在归档和解档之前先实现父类的归档和解档方法。即 [super encodeWithCoder:aCoder]
和 [super initWithCoder:aDecoder]
方法;

2.使用

需要把对象归档是调用NSKeyedArchiver的工厂方法 archiveRootObject: toFile:
方法。

NSString *file = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,
YES).firstObject stringByAppendingPathComponent:@"person.data"];
Person *person = [[Person alloc] init];
person.avatar =
self.avatarView.image;
person.name =
self.nameField.text;
person.age = [self.ageField.text integerValue];
[NSKeyedArchiver archiveRootObject:person toFile:file];

需要从文件中解档对象就调用NSKeyedUnarchiver的一个工厂方法 unarchiveObjectWithFile:
即可。

NSString *file = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,
YES).firstObject stringByAppendingPathComponent:@"person.data"];
Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:file];

if (person) {

self.avatarView.image = person.avatar;

self.nameField.text = person.name;

self.ageField.text = [NSString stringWithFormat:@"%ld", person.age];
}

3.注意

必须遵循并实现NSCoding协议

保存文件的扩展名可以任意指定

继承时必须先调用父类的归档解档方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: