持久化数据(数据保存)
IOS数据存储常用的方式
1、XML属性列表(plist)归档
2、Preference(偏好设置)
3、NSKeyedArchiver归档
4、Sqlite3
5、Core Data
数据存储位置:
每个应用都有自己的应用沙盒(应用沙盒就是自己的文件系统目录),与其他应用隔离
路径:
/Users/apple/Library/Application Support/Iphone Simulator/7.0/Application
应用沙盒的文件系统一级目录:
Layer---------------应用程序包,包含所有的资源文件和可执行文件
Documents-----------保存应用运行时生成需要持久化的数据,iTunes同步设备时,会备份该目录,重要数据存放,比如游戏存档
Library-------------
tmp-----------------保存应用程序的临时数据,当软件没有运行时,系统可能随机清理掉该目录下文件
Library下目录,二级目录:
Library/Caches-------保存应用运行时生成需要持久化数据,但是iTunes不会备份它
Library/Prference----保存应用的偏好设置,iTunes同步设备时,会备份该目录,一般是系统操作,我们不用操作
//
数据存储案例一(plist存储)
如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,就可以使用writeToFile:atomically:方法直接将对象写到属性列表文件中
缺点:只能存常见数据类型,如模型Person则不能存储
/**
* 数据存储
*/
- (IBAction)save
{
//1、获取沙盒根路径
NSString *home = NSHomeDirectory();
//2、document路径
NSString *docuPath = [home stringByAppendingPathComponent:@"Documents"];
//3、新建数据
//存数组
NSArray *data = @[@"jack", @10, @"jack love rose"];
NSString *filePath = [docuPath stringByAppendingPathComponent:@"data.plist"];
[data writeToFile:filePath atomically:YES];
//存字典
NSDictionary *dict = @{@"Tom":@"23", @"Jerry":@"12", @"Cookie":@"32", @"Xiao":@"43"};
NSString *fileDictPath = [docuPath stringByAppendingPathComponent:@"data2.plist"];
[dict writeToFile:fileDictPath atomically:YES];
NSLog(@"%@", filePath);
}
//
/**
* 数据读取
*/
- (IBAction)read
{
//读取
//1、获取沙盒根路径
NSString *home = NSHomeDirectory();
//2、document路径
NSString *docuPath = [home stringByAppendingPathComponent:@"Documents"];
//3、文件路径
NSString *filePath = [docuPath stringByAppendingPathComponent:@"data.plist"];
//4、读取数据
NSArray *array = [NSArray arrayWithContentsOfFile:filePath];
NSLog(@"%@", array);
}
数据存储案例二(偏好设置存储)
存储简单的软件参数配置
偏好存储不用关心存储的路径,默认会找到
缺点:不能改变路径和保存的文件的名字
//
/**
* 数据存储
*/
- (IBAction)save
{
//1、利用NSUserDefaults就能直接访问软件的偏好设置
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
//2、存储数据
[defaults setObject:@"fl" forKey:@"account"];
[defaults setInteger:20 forKey:@"age"];
[defaults setBool:true forKey:@"aotologin"];
//3、立刻同步
[defaults synchronize];
NSLog(@"%@", NSHomeDirectory());
}
/**
* 数据读取
*/
- (IBAction)read
{
//1、利用NSUserDefaults就能直接访问软件的偏好设置
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
//2、读取数据
NSString *name = [defaults objectForKey:@"account"];
NSInteger *age = [defaults integerForKey:@"age"];
BOOL isAutoLogin = [defaults boolForKey:@"aotologin"];
}
//
数据存储三(普通对象Person\Student...)
逻辑:
1、普通对象如果想完成存储,则该对象必须遵守<NSCoding>协议
eg: @interface Person : NSObject <NSCoding>
2、因为遵守了协议时为了实现某个方法
- (void)encodeWithCoder:(NSCoder *)encoder 方法,在这个方法中告诉存储里需要存储哪些字段
eg:
/**
* 将对象写入文件之前会调用这个方法
* 在这个方法说清楚:1、哪些属性需哟存储,2、怎样存储这些属性
*/
- (void)encodeWithCoder:(NSCoder *)encoder
{
//将_name属性值进行编码
[encoder encodeObject:_name forKey:@"name"];
//存储年龄
[encoder encodeInt:_age forKey:@"age"];
}
3、调用方法,完成存储
/**
* 数据存储
*/
- (IBAction)save
{
/**
* 保存一个Person对象
*/
Person *p = [[Person alloc] init];
p.name = @"jack";
p.age = 24;
p.height = 1.54;
NSString *path = @"/Users/fulin/Desktop/person.data";//这里文件名和格式可以任意命名
[NSKeyedArchiver archiveRootObject:p toFile:path];
}
4、数据的读取
根据上面模式,对象存储的时候遵守协议,完成方法,自然读取的时候也是同样的做法
@interface Person : NSObject <NSCoding> 同上遵守同一个协议
实现某个方法
- (id)initWithCoder:(NSCoder *)aDecoder
/**
* 将对象读取
*
*/
- (id)initWithCoder:(NSCoder *)decoder
{
if (self == [super init]) {
_name = [decoder decodeObjectForKey:@"name"];
_age = [decoder decodeObjectForKey:@"age"];
}
return self;
}
调用方法读取:
/**
* 数据读取
*/
- (IBAction)read
{
//1、路径
NSString *path = @"/Users/fulin/Desktop/person.data";//这里文件名和格式可以任意命名
//2、读取
Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
NSLog(@"%@", p.name);
}
补充:如果是子类,需要完成上面普通对象存储,则继承中,重写某个遵守协议的方法,同时调用父类的方法
总结:
数据的存储
最新推荐文章于 2021-11-28 16:53:37 发布