首页 > 代码库 > ios数据存储方式
ios数据存储方式
iOS应用数据存储的常用方式
1.xml属性列表(plist)归档
2. Preference(偏好设置)
3.NSKeyedArchive归档(NSCoding)
4.SQLite
5.Core Data
1.xml属性列表(plist)归档
"plist文件存储"1.字符串 数组 字典 可以直接存储数据在一个文件2.掌握沙盒备目录的作用以及目录路径获取方式// Document [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]// 缓存 [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];// 临时 NSTemporaryDirectory();// 主目录 NSHomeDirectory();3.不是所有对象都可以保存到plist文件中,要有实现writeFile方法才可以4.学会使用SimPholders2打开沙盒目录
@interface HJPlistController ()@property (weak, nonatomic) IBOutlet UILabel *textView;@property (strong,nonatomic) NSString *docPath;- (IBAction)stringWrite:(id)sender;- (IBAction)stringRead:(id)sender;- (IBAction)arrayWrite:(id)sender;- (IBAction)arrayRead:(id)sender;- (IBAction)dictionoryWrite:(id)sender;- (IBAction)dictionaryRead:(id)sender;@end/** * 使用xml plist属性列表归档 ,preference偏好设置,使用NSKeyedArchiver归档(NSCoding) */@implementation HJPlistController- (NSString *)docPath{ // 获取 "沙盒"document目录 if (_docPath == nil) { _docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; _docPath = [_docPath stringByAppendingPathComponent:@"data.plist"]; } return _docPath;}- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // Do any additional setup after loading the view, typically from a nib. //查看沙盒的路径 //1.控制台打印沙盒的路径,使用finder-前往-文件夹 打开 //2.控制台打印沙盒的路径,打开终端 open + 路径 //3.使用simpholders工具 //4.可以断点 输入po NSHomeDirectory() //获取缓存路径(cache)// NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];// NSLog(@"%@",cachePath);// // // //获取临时路径(tmp)// NSString *tmpPath = NSTemporaryDirectory();// NSLog(@"%@",tmpPath);// // //主目录// NSString *homePath = NSHomeDirectory();// NSLog(@"%@",homePath); }- (IBAction)stringWrite:(id)sender { NSLog(@"%@",self.docPath); NSString *data = http://www.mamicode.com/@"ios中国"; [data writeToFile:self.docPath atomically:YES encoding:NSUTF8StringEncoding error:nil];}- (IBAction)stringRead:(id)sender { NSString *resultStr = [NSString stringWithContentsOfFile:self.docPath encoding:NSUTF8StringEncoding error:nil]; self.textView.text = resultStr;}- (IBAction)arrayWrite:(id)sender{ NSArray *dataArray = [NSArray arrayWithObjects:@"a",@"b",@"c",@"中",@"国", nil]; [dataArray writeToFile:self.docPath atomically:YES];}- (IBAction)arrayRead:(id)sender{ NSArray *resultData = http://www.mamicode.com/[NSArray arrayWithContentsOfFile:self.docPath];"\n"]; } self.textView.text = ms;}- (IBAction)dictionoryWrite:(id)sender{ NSDictionary *dict = @{@"a":@"1",@"2":@"2",@"zh":@"中国"}; [dict writeToFile:self.docPath atomically:YES];}- (IBAction)dictionaryRead:(id)sender{ NSDictionary *resultData = http://www.mamicode.com/[NSDictionary dictionaryWithContentsOfFile:self.docPath];"%@:%@",key,resultData[key]]; [ms appendString:@"\n"]; } self.textView.text = ms;}@end
2."用户偏好设置"
"用户偏好设置"1.ios中有个NSUserDefaults对象有可保存数据,我们称为用户偏好设置2.通过[NSUserDefaults standardUserDefaults]可以获取用户偏好设置对象,保存字符串 布尔值 int等数据3.保存数据时,一定要调用synchronize,因为数据要及时保存到沙盒的文件中/* NSUserDefaults *defualts = [NSUserDefaults standardUserDefaults]; [defualts setObject:@"zhangsan" forKey:@"username"]; [defualts setObject:@"123" forKey:@"password"]; [defualts setBool:YES forKey:@"autoLogin"]; [defualts setBool:YES forKey:@"rememberPwd"]; //同步 [defualts synchronize];*/
4.掌握用户偏好设置数据的获取,更改,删除
@interface HJPreferenceController ()@property (weak, nonatomic) IBOutlet UITextField *pwdTextField;@property (weak, nonatomic) IBOutlet UISwitch *rememberSwith;@property (weak, nonatomic) IBOutlet UILabel *dataLabel;- (IBAction)saveBut:(id)sender;- (IBAction)readBut:(id)sender;- (IBAction)updateBut:(id)sender;- (IBAction)deleteBut:(id)sender;@end@implementation HJPreferenceController- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view.}- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated.}/*#pragma mark - Navigation// In a storyboard-based application, you will often want to do a little preparation before navigation- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller.}*/- (IBAction)saveBut:(id)sender { NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults]; [userDefault setObject:self.pwdTextField.text forKey:@"pwd"]; [userDefault setBool:self.rememberSwith.isOn forKey:@"isRememberPwd"]; // 同步数据 [userDefault synchronize];}- (IBAction)readBut:(id)sender { NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults]; self.dataLabel.text = [NSString stringWithFormat:@"%@:%@ %@:%d",@"pwd",[userDefault objectForKey:@"pwd"],@"isRememberPwd",[userDefault boolForKey:@"isRememberPwd"]];}// 修改偏好设置就是把键值重写设置 这样会覆盖原有的键值- (IBAction)updateBut:(id)sender { NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults]; [userDefault setObject:self.pwdTextField.text forKey:@"pwd"]; [userDefault setBool:self.rememberSwith.isOn forKey:@"isRememberPwd"]; [userDefault synchronize]; self.dataLabel.text = [NSString stringWithFormat:@"%@:%@ %@:%d",@"pwd",[userDefault objectForKey:@"pwd"],@"isRememberPwd",[userDefault boolForKey:@"isRememberPwd"]]; }- (IBAction)deleteBut:(id)sender { NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults]; [userDefault removeObjectForKey:@"isRememberPwd"]; [userDefault synchronize]; self.dataLabel.text = [NSString stringWithFormat:@"%@:%@ %@:%d",@"pwd",[userDefault objectForKey:@"pwd"],@"isRememberPwd",[userDefault boolForKey:@"isRememberPwd"]];}@end
3.NSKeyedArchive归档(NSCoding)
"NSKeyedArchiver归档"/*什么叫归档 归档就是把数据保存到一个文件中*/1.使用NSKeyedArchiver可以将NSArray NSDictiony NSString等对象归档到一个文件2.只有实现了NSCoding协议的对象才可使用NSKeyedArchiver进行归档3.将模型对象保存到一个文件时,对象要遵守NSCoding协议,并实现NSKeyedArchiver的encodeWithCoder方法,4.从归档文件里读取对象时要实现NSCoding的initWithCoder方法5.ios中,控制器,控件都继承NSCoding,storyboard/xib都是使用NSKeyedArchiver进行归档的
#import <Foundation/Foundation.h>@interface HJPerson : NSObject<NSCoding>@property (nonatomic,copy) NSString *name;@property (nonatomic,assign) int age;@property (nonatomic,strong) NSDate *birthday;@end
#import "HJPerson.h"@implementation HJPerson- (void)encodeWithCoder:(NSCoder *)aCoder{ [aCoder encodeObject:self.name forKey:@"name"]; [aCoder encodeInt:self.age forKey:@"age"]; [aCoder encodeObject:self.birthday forKey:@"birthday"];}- (id)initWithCoder:(NSCoder *)aDecoder{ if (self == [super init]) { self.name = [aDecoder decodeObjectForKey:@"name"]; self.age = [aDecoder decodeIntForKey:@"age"]; self.birthday = [aDecoder decodeObjectForKey:@"birthday"]; } return self;}@end
#import "HJPerson.h"#warning 父类遵循了NSCoding方法就可以再此不遵循@interface HJStudent : HJPerson@property (nonatomic,strong) NSString *no;@end
#import "HJStudent.h"@implementation HJStudent- (void)encodeWithCoder:(NSCoder *)aCoder{#warning 记得在此调用父类的方法进行初始化 [super encodeWithCoder:aCoder]; [aCoder encodeObject:self.no forKey:@"no"];}- (id)initWithCoder:(NSCoder *)aDecoder{#warning 记得在此调用父类的方法进行初始化 if (self == [super initWithCoder:aDecoder]) {#warning 记得一定在此给属性赋值操作 self.no = [aDecoder decodeObjectForKey:@"no"]; } return self;}- (NSString *)description{ return [NSString stringWithFormat:@"%@,%d,%@,%@",self.name,self.age,self.birthday,self.no];}@end
//// HJCodingController.m// 数据存储//// Created by HJiang on 14/12/30.// Copyright (c) 2014年 HJiang. All rights reserved.//#import "HJCodingController.h"#import "HJStudent.h"@interface HJCodingController ()@property (strong,nonatomic) NSString *docPath;@property (weak, nonatomic) IBOutlet UITextField *nameTextField;@property (weak, nonatomic) IBOutlet UITextField *ageTextField;@property (weak, nonatomic) IBOutlet UITextField *noTextField;@property (weak, nonatomic) IBOutlet UITextField *birthdayTextField;@property (weak, nonatomic) IBOutlet UILabel *resultLabel;- (IBAction)birthdayChange:(UIDatePicker *)sender;- (IBAction)saveBut:(id)sender;- (IBAction)readBut:(id)sender;@end@implementation HJCodingController- (NSString *)docPath{ // 获取 "沙盒"document目录 if (_docPath == nil) { _docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; _docPath = [_docPath stringByAppendingPathComponent:@"data.archiver"]; } return _docPath;}- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. }- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated.}/*#pragma mark - Navigation// In a storyboard-based application, you will often want to do a little preparation before navigation- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller.}*/- (IBAction)birthdayChange:(UIDatePicker *)sender { NSDate *birthday = sender.date; NSDateFormatter *df = [[NSDateFormatter alloc] init]; df.dateFormat = @"yyyy-MM-dd"; self.birthdayTextField.text = [df stringFromDate:birthday]; }- (IBAction)saveBut:(id)sender { HJStudent *stu = [[HJStudent alloc] init]; stu.name = self.nameTextField.text; stu.age = [self.ageTextField.text intValue]; NSDateFormatter *df = [[NSDateFormatter alloc] init]; df.dateFormat = @"yyyy-MM-dd"; stu.birthday = [df dateFromString:self.birthdayTextField.text]; stu.no = self.noTextField.text; NSLog(@"%@",stu); BOOL isSuccess = [NSKeyedArchiver archiveRootObject:stu toFile:self.docPath]; NSLog(@"%@",isSuccess?@"保存成功":@"保存失败"); }- (IBAction)readBut:(id)sender { NSLog(@"%@",self.docPath); HJStudent *stu = [NSKeyedUnarchiver unarchiveObjectWithFile:self.docPath]; NSLog(@"%@",stu); self.resultLabel.text = [NSString stringWithFormat:@"%@,%d,%@,%@",stu.name,stu.age,stu.birthday,stu.no];}@end
ios数据存储方式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。