美文网首页
iOS中的数据存储

iOS中的数据存储

作者: imChay | 来源:发表于2017-10-13 15:33 被阅读12次
  • 应用沙盒
  • 归档
  • 偏好设置
  • Plist

应用沙盒

Documents
Library -- Caches
        -- Preferences
tmp

归档

Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject <NSCoding>

/** 姓名 */
@property(nonatomic,copy) NSString* name;
/** 昵称 */
@property(nonatomic,copy) NSString* nickName;

@end

Person.m

#import "Person.h"

@implementation Person

// 归档:只要一个自定义对象归档的时候就会调用,告诉系统 哪些属性需要归档
- (void)encodeWithCoder:(NSCoder *)coder
{
    [coder encodeObject:_name forKey:@"name"]; // 给属性设置一个key
    [coder encodeObject:_nickName forKey:@"nickName"];
}


//解档:只要一个自定义对象解档的时候就会调用,告诉系统 解析key得到的值,赋值给哪个属性
- (id)initWithCoder:(NSCoder *)aDecoder{
//    什么时候调用 [super initWithCoder]
    if (self = [super init]) {
        _name = [aDecoder decodeObjectForKey:@"name"];
        _nickName = [aDecoder decodeObjectForKey:@"nickName"];
    }
    return self;
}

@end

ViewController.m

#import "ViewController.h"
#import "Person.h"
//---------------思路----------------
//1、创建自定义对象
//   重写encodeWithCoder 归档
//   initWithCoder方法  解档
//2、创建路径  /caches
//3、使用归档类方法进行存储
//   使用解档类方法进行解档
//-----------------------------------

@interface ViewController ()

- (IBAction)save:(id)sender;
- (IBAction)read:(id)sender;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (IBAction)save:(id)sender {
//    1、创建对象
    Person *p = [[Person alloc] init];
    p.name = @"李明";
    p.nickName = @"hahaha";
    
//    2.1、创建路径/tmp,使用函数
    NSString *cachesPath = NSTemporaryDirectory();
//    2.2、拼接路径;扩展名随意写,苹果对内容进行了加密
    NSString *path = [cachesPath stringByAppendingString:@"person.data"];
    
//    3、使用归档类方法进行存储
    [NSKeyedArchiver archiveRootObject:p toFile:path];
}

- (IBAction)read:(id)sender {
    
    NSString *cachesPath = NSTemporaryDirectory();
    NSString *path = [cachesPath stringByAppendingString:@"person.data"];
    
    Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
    NSLog(@"%@,%@",p.name,p.nickName);
}
@end

归档:什么时候调用super initWithCoder

#import "MyView.h"
@implementation MyView

// 解析文件的时候调用
// 作用:解析xib,storyboard调用
// 可以猜测 我们平时在storyboard中拖动的控件,是通过归档存储的,当创建的时候就解析 归档文件 然后实例化
- (id)initWithCoder:(NSCoder *)aDecoder{
    // 这里必须调用[super initWithCoder:aDecoder],super ->UIView
    // 什么时候调用[super initWithCoder:aDecoder],只要父类遵守了NSCoding协议,就调用[super initWithCoder:aDecoder]
    if(self = [super initWithCoder:aDecoder])
    {
        NSLog(@"调用了initWithCoder");
    }
    return self;
}

@end

偏好设置

#import "ViewController.h"

@interface ViewController ()

- (IBAction)save:(id)sender;
- (IBAction)read:(id)sender;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (IBAction)save:(id)sender {
//    /Library/Preferences
//    获取单例对象
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setValue:@"YChiong" forKey:@"name"];
    [userDefaults setObject:@"xmg" forKey:@"address"];
    [userDefaults setBool:YES forKey:@"isHandSome"];
    [userDefaults setInteger:25 forKey:@"age"];
}

- (IBAction)read:(id)sender {
    //    获取单例对象
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    
    NSString *name = [userDefaults valueForKey:@"name"];
    NSString *address = [userDefaults objectForKey:@"address"];
    BOOL isHandSome = [userDefaults boolForKey:@"isHandSome"];
    NSInteger age = [userDefaults integerForKey:@"age"];
    
    NSLog(@"%@,%@,%i,%i",name,address,isHandSome,age);
}
@end

Plist

#import "ViewController.h"

@interface ViewController ()
- (IBAction)save:(id)sender;
- (IBAction)read:(id)sender;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (IBAction)save:(id)sender {
//    1、创建数组或者字典
    NSArray *arr = @[@"YChiong",@25];
//    2、创建存储路径
//    2.1  /Library/Caches文件夹
//    参数:
//    NSSearchPathDirectory directory:获取哪个文件夹
//    NSSearchPathDomainMask domainMask:在哪个范围下获取 NSUserDomainMask:在用户的范围内搜索?
//    BOOL expandTilde:expandTilde是否展开全路径,YES:展开
//    返回值:一个数组
    NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
//    2.2 拼接路径
    NSString *plistPath = [cachePath stringByAppendingPathComponent:@"YChiong.plist"];
    
//    3、存储数组/字典 到 指定路径
    [arr writeToFile:plistPath atomically:YES];
}

- (IBAction)read:(id)sender {
//    怎么存,就怎么取
    NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
    NSString *plistPath = [cachePath stringByAppendingPathComponent:@"YChiong.plist"];
    
    NSArray *arr = [NSArray arrayWithContentsOfFile:plistPath];
    NSLog(@"%@",arr);
}
@end

相关文章

  • iOS数据存储--数据库

    iOS中数据存储方式 iOS中数据存储方式主要有以下几种 Plist NSUserDefaults NSCodin...

  • iOS基础之数据存储

    iOS数据存储 1. 概论 在iOS开发中数据存储的方式可以归纳为两类: 存储文件 和 存储到数据库. 2.文件存...

  • iOS数据存储

    iOS数据存储 数据存储

  • iOS开发-数据存储SQLite介绍

    iOS中数据存储 1.开发中、常见的数据存储有一下几种● Plist(NSArray\NSDictionary)●...

  • Swift之沙盒与数据存储

    应用沙盒结构分析 IOS中的数据存储 1、存储为plist属性列表 2、使用NSUserDefaults存储数据 ...

  • ios CoreData(一)

    CoreData简述 CoreData是ios系统推荐给我们的数据存储方案。在ios中数据存储有多种方式,包括NS...

  • iOS数据存储

    在iOS开发中必不可少的要用到数据存储,数据的处理是iOS开发中的核心技术,适当的对数据进行持久化存储可以实现应用...

  • iOS数据存储之偏好设置和属性列表

    前言 在iOS开发中必不可少的要用到数据存储,数据的处理是iOS开发中的核心技术,适当的对数据进行持久化存储可以实...

  • iOS的数据存储

    背景 在iOS开发中必不可少的要用到数据存储,数据的处理是iOS开发中的核心技术,适当的对数据进行持久化存储可以实...

  • iOS数据库存储之SQLite3

    资源连接: iOS数据库存储之SQL语句; iOS数据存储之文件沙盒; iOS数据存储之NSCoding; SQL...

网友评论

      本文标题:iOS中的数据存储

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