iOS数据存储与IO

作者: Z_Aaron | 来源:发表于2016-12-06 18:46 被阅读0次

    一、应用程序沙盒

    什么是沙盒机制?

    保证每个应用程序只能访问本沙盒内的数据,避免与其他应用形式发生冲突,提供了更好的安全机制。

    什么又是应用程序的沙盒 ?

    iOS应用程序只能在系统为该应用所分配的文件区域下读写文件,这个文件域为该应用程序的沙盒。

    1.通常用单文件保存数据,应用程序要保存、读取数据量不大可以考虑NSArray中的arrayWithContentsOfFile:方法和NSDictionary中的dictionaryWithContentsOfFile:方法来保存读取数据。(缺点:每次读取总会一次性加载全部文件内容造成内存紧张,当保存文件时即使改动了一小部分程序也将要把其中所有数据写入文件)

    2.多文件保存数据是另一种数据持久化的解决方案,例如电子邮件,由于内容相差较大,关联较小因此每个电子邮件采用一个文件存储。

    优点:应用程序使用哪部分数据就加载哪个文件,避免了一次性加载所有持久化数据造成的内存紧张。如果修改了哪部分数据,保存对应文件即可,避免了同时保存所有持久化数据。

    缺点:多文件保存数据必然带来编程的复杂性,可能额外建立数据结构管理持久化内容与存储文件中间的对应关系。

    二、应用程序参数与用户默认设置

    1、Settings Bundle

    应用程序有少量的保存而且这些数据的格式很简单(字符串,标量类型值等),例如是否打开音效、是否振动、游戏玩家游戏名等。

    2、plist

    本质就是NSDictionary(key只能是NSString类型,Value可以是Boolean,NSData,NSDate,NSNumber,NSString,NSArray,NSdictionary)或NSArray.

    3、NSUserDefaults读取、保存应用程序参数

    获取NSUserDefaults对象

    NSUserDefaults *defaults=[NSUserDefaults standardUserDedaults];

    xxxForKey: (NSString*)key: 根据指定的key获取对应的参数值,随着参数值类型的不同,xxx可以随之改变。

    setBool:(Xxx)value forKey:(NSString *)key: 设置参数。

    调用synchronize方法进行保存

    例:

    //

    //  ViewController.m

    //  NSUserDefaults读取和保存应用程序参数

    //

    //  Created by apple on 2016/12/1.

    //  Copyright © 2016年 apple. All rights reserved.

    //

    #import "ViewController.h"

    @interface ViewController ()

    @property (weak, nonatomic) IBOutlet UITextField *nameText;

    @property (weak, nonatomic) IBOutlet UITextField *password;

    @property (weak, nonatomic) IBOutlet UITextField *bgmusic;

    @property (weak, nonatomic) IBOutlet UITextField *speed;

    @property (weak, nonatomic) IBOutlet UITextField *race;

    - (IBAction)save:(id)sender;

    - (IBAction)revise:(id)sender;

    @end

    @implementation ViewController

    - (void)viewDidLoad {

    super viewDidLoad];

    //让每个UITextfield变为不可编辑状态

    _nameText.userInteractionEnabled = NO;

    _password.userInteractionEnabled = NO;

    _bgmusic.userInteractionEnabled = NO;

    _speed.userInteractionEnabled = NO;

    _race.userInteractionEnabled = NO;

    //获取该应用UIApplication对象

    UIApplication *app=[UIApplication sharedApplication];

    //注册让self监视app发出的UIApplicationWillEnterForegroundNotification通知

    //该通知发生时,激活appWillEnterFore

    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(appWillEnterFore:) name:UIApplicationWillEnterForegroundNotification object:app];

    }

    -(void)refreshFileds{

    //获取该应用的NSUserDefaults

    NSUserDefaults* defaults=[NSUserDefaults standardUserDefaults];

    //获取NSUserDefaults中保存的值来更新界面上的UI控件值

    self.nameText.text=[defaults stringForKey:@"name"];

    self.password.text=[defaults stringForKey:@"password"];

    self.bgmusic.text=[defaults stringForKey:@"bgmusic"];

    self.speed.text=[defaults stringForKey:@"speed"];

    self.race.text=[defaults stringForKey:@"race"];

    }

    //当该视图控制器显示时会自动调用该方法

    -(void)viewWillAppear:(BOOL)animated{

    [super viewWillAppear:animated];

    //使用NSUserDefault中的参数更新界面上的UI控件的值

    [self refreshFileds];

    }

    //接收到通知时激发该方法

    -(void) appWillEnterFore:(NSNotification*) notification{

    NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];

    //保存所有修改

    [defaults synchronize];

    //使用NSUserDefaults中的参数更新界面上的UI控件的值

    [self refreshFileds];

    }

    - (IBAction)save:(id)sender {

    //让每个UITextfield变为不可编辑状态

    _nameText.userInteractionEnabled = NO;

    _password.userInteractionEnabled = NO;

    _bgmusic.userInteractionEnabled = NO;

    _speed.userInteractionEnabled = NO;

    _race.userInteractionEnabled = NO;

    NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];

    //将nameText控件值设置到NSUserDefaults中

    [defaults setValue:_nameText.text forKey:@"name"];

    [defaults setValue:_password.text forKey:@"password"];

    [defaults setValue:_bgmusic.text forKey:@"bgmusic"];

    [defaults setValue:_speed.text forKey:@"speed"];

    [defaults setValue:_race.text forKey:@"race"];

    //保存修改

    [defaults synchronize];

    }

    - (IBAction)revise:(id)sender {

    //让每个UITextfield变为可编辑状态

    _nameText.userInteractionEnabled = YES;

    _password.userInteractionEnabled = YES;

    _bgmusic.userInteractionEnabled = YES;

    _speed.userInteractionEnabled = YES;

    _race.userInteractionEnabled = YES;

    //    NSLog(@"%@", self.nameText.userInteractionEnabled ? @"YES" : @"NO");

    }

    //点击背景回收键盘

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

    UITouch *touch = [touches anyObject];

    UIView *view = (UIView *)[touch view];

    if (view ==self.view) {

    [self.nameText resignFirstResponder];

    [self.password resignFirstResponder];

    [self.bgmusic resignFirstResponder];

    [self.speed resignFirstResponder];

    [self.race resignFirstResponder];

    }

    }

    @end

    代码下载:https://github.com/Z-Aaron/https-github.com-Z-Aaron-NSUserDefaults.git

    4、属性列表(针对于只需要保存简单数据的应用)

    (1)NSArray和NSDictionary对象都提供了下面的方法将其包含的数据写入属性文件。

    writeToFile:(NSString*)filePath atomically:(BOOL)flag

    (2)恢复数据调用以下方法

    xxxWithContentsOfFile:(NSString*)filePath

    代码下载:https://github.com/Z-Aaron/memo.git

    相关文章

      网友评论

        本文标题:iOS数据存储与IO

        本文链接:https://www.haomeiwen.com/subject/umhzpttx.html