iOS开发之数据存储
Posted weishinexk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS开发之数据存储相关的知识,希望对你有一定的参考价值。
一、ios应用数据存储的常用方式
- XML属性列表(plist)归档
- Preference(偏好设置) 本质还是通过“plist”来存储数据, 但是使用更简单(无需关注文件、文件夹路径和名称)
- NSKeyedArchiver归档(NSCoding) 把任何对象, 直接保存为文件的方式。
- SQLite3 当非常大量的数据存储时使用
- Core Data 就是对SQLite的封装
二、获取路径
- 获取bundle路径
NSString *path = [NSBundle mainBundle].bundlePath;
-获取沙盒路径
NSString *home = NSHomeDirectory();
三、沙盒路径目录结构
-Document 保存应用运行时生成的需要持久化的数据
-library
Caches 保存应用运行时生成的需要持久化的数据
Preferences 保存应用的所有偏好设置
-temp 保存应用运行时所需的临时数据
四、利用沙盒根目录拼接”Documents”字符串
方式一:(拼接字符串)
NSString *home =NSHomeDirectory(); NSString *documents = [home stringByAppendingString:@“/Documents"];
方式二:(作为路径的一部分)
NSString *home =NSHomeDirectory(); NSString*documents =[homestringByAppendingPathComponent:@"Documents"];
方式三:()
参数1:目标文件,参数二:作用域, 参数三:是否展开波浪线 [NSSearchPathForDirectoriesInDomains(<#NSSearchPathDirectory directory#>, <#NSSearchPathDomainMask domainMask#>, <#BOOL expandTilde#>)] NSString * documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
五、获取caches文件夹路径
//获取caches文件夹
NSString * cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, NO) lastObject];
六、获取偏好设置文件夹路径
NSTemporaryDirectory()
七、plist数据的存储与读取
//数据存储
NSArray * names = [NSArray arrayWithObjects:@"Bob",@"王宝", @"球童",@"Jack",nil]; // 1.获取路径 NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; // 2.拼接文件名 NSString * filePath = [path stringByAppendingPathComponent:@"names.plist"]; // 3. 存储 // atomically 是否允许原子写入 [names writeToFile:filePath atomically:YES]; NSLog(@"%@",filePath);
读取数据
//1.获取数据路径 NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; //2.拼接文件路径 NSString * filePath = [path stringByAppendingPathComponent:@"names.plist"]; //3.读取数据 NSArray * names = [NSArray arrayWithContentsOfFile:filePath]; NSLog(@"%@",names);
八、plist数据的存储与读取
//偏好设置存储
//1.获取NSUserDefaults对象 NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults]; //2.存储数据 [userDefaults setObject:@"Jack" forKey:@"name"]; [userDefaults setInteger:23 forKey:@"age"]; [userDefaults setBool:YES forKey:@"sex"]; //3.立即存储 [userDefaults synchronize]; NSLog(@"%@",NSHomeDirectory());
//读取偏好设置
//1.获取NSUserDefaults对象 NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults]; //2.读取数据 NSString * name = [userDefaults objectForKey:@"name"]; NSInteger age = [userDefaults integerForKey:@"age"]; BOOL sex = [userDefaults boolForKey:@"sex"]; NSLog(@"name =%@ age = %ld sex = %d",name,age,sex);
九、归档与反归档
“归档”:是一种可以把任何对象,直接保存为文件的方式。
- 如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复
- 不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以
- NSCoding协议有2个方法:
- encodeWithCoder:
每次归档对象时,都会调用这个方法。一般在这个方法里面指定如何归档对象中的每个实例变量,可以使用encodeObject:forKey:方法归档实例变量
- initWithCoder:
每次从文件中恢复(解码)对象时,都会调用这个方法。一般在这个方法里面指定如何解码文件中的数据为对象的实例变量,可以使用decodeObject:forKey方法解码实例变量
CZPerson.h
[x] 注意:改方法要遵守NSCodiing协议
#import <Foundation/Foundation.h>
@interface CZPerson : NSObject<NSCoding
@property (nonatomic,copy) NSString * name;
@property (nonatomic,copy) NSString * phone;
@end
CZPerson.m
[x] 注意:实现NSCodiing协议的方法*
#import "CZPerson.h"
@implementation CZPerson
//确定要存储对象的哪些属性
- (void)encodeWithCoder:(NSCoder *)aCoder
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.phone forKey:@"phone"];
//确定要读取对象的哪些属性
- (id)initWithCoder:(NSCoder *)aDecoder
if(self = [super init])
self.name = [aDecoder decodeObjectForKey:@"name"];
self.phone = [aDecoder decodeObjectForKey:@"phone"];
return self;
@end
ViewController.m
#import "ViewController.h"
#import "CZPerson.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//反归档 (反序列化)
//1.获取路径
NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
//2.拼接文件名
NSString * filePath = [path stringByAppendingPathComponent:@"person"];
//3.通过反归档读取数据
CZPerson * p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"name =%@ phone = %@",p.name,p.phone);
// [self test01];
//归档 (序列化)
- (void) test01
//创建person对象
CZPerson * person = [[CZPerson alloc] init];
//赋值
person.name = @"JackMeng";
person.phone = @"186000001";
//获取路径
NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
//拼接文件名
NSString * filePath = [path stringByAppendingPathComponent:@"person"];
// 归档
[NSKeyedArchiver archiveRootObject:person toFile:filePath];
NSLog(@"%@",NSHomeDirectory());
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
@end
ViewController.h
#import "ViewController.h"
#import "CZPerson.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//反归档 (反序列化)
//1.获取路径
NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
//2.拼接文件名
NSString * filePath = [path stringByAppendingPathComponent:@"person"];
//3.通过反归档读取数据
CZPerson * p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"name =%@ phone = %@",p.name,p.phone);
// [self test01];
//归档 (序列化)
- (void) test01
//创建person对象
CZPerson * person = [[CZPerson alloc] init];
//赋值
person.name = @"JackMeng";
person.phone = @"186000001";
//获取路径
NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
//拼接文件名
NSString * filePath = [path stringByAppendingPathComponent:@"person"];
// 归档
[NSKeyedArchiver archiveRootObject:person toFile:filePath];
NSLog(@"%@",NSHomeDirectory());
@end
以上是关于iOS开发之数据存储的主要内容,如果未能解决你的问题,请参考以下文章