iOS学习iOS 开发每天分享优质文章iOS学习笔记

ios的数据持久化

2017-06-16  本文已影响52人  快乐的tomato

一、what

数据持久化,就是数据存储。

二、iOS数据存储的方式

有5中方式

三、沙盒

四、plist文件

如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,就可以使用writeToFile:atomically:方法直接将对象写到属性列表文件中。

- (IBAction)saveDataBtnClick:(id)sender {
    
    // youtube做法
//    NSString *path = @"/Users/apple/Library/Application Support/iPhone Simulator/7.1/Applications/A6D53E11-DDF0-4392-B2D4-FE77A96888A6/Documents/abc.plist";
    
    // 获取应用程序沙河目录
    // NSString *home = NSHomeDirectory();
    // 不建议写/
//    NSString *path = [home stringByAppendingString:@"/Documents"];
    // 不建议Documents写死
//    NSString *path = [home stringByAppendingPathComponent:@"Documents"];
    
    // NSUserDomainMask 在用户目录下查找
    // YES 代表用户目录的~
    // NSDocumentDirectory 查找Documents文件夹
    // 建议使用如下方法动态获取
    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    // 拼接文件路径
    NSString *path = [doc stringByAppendingPathComponent:@"abc.plist"]
    ;
    NSLog(@"%@", path);
//    NSArray *arr = @[@"lnj", @"28"];
//    [arr writeToFile:path atomically:YES];
    
    // NSDictionary *dict = @{@"name": @"lnj", @"age":@"28"};
    // 调用writeToFile将数据写入文件
    // [dict writeToFile:path atomically:YES];
    
    /*
     plist只能存储系统自带的一些常规的类, 也就是有writeToFile方法的对象才可以使用plist保存数据
     字符串/字典/数据/NSNumber/NSData ...
     */
    
    // 自定义的对象不能保存到plist中
    // NJPerson *p = [[NJPerson alloc] init];
    // p.name =@"lnj";
    
    // NSDictionary *dict = @{@"person": @"abc"};
    [dict writeToFile:path atomically:YES];
}
/**
 *   点击读取按钮
 */
- (IBAction)readDataBtnClick:(id)sender {
    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    
    NSString *path = [doc stringByAppendingPathComponent:@"abc.plist"]
    ;
    // 读取数据
    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
    NSLog(@"%@", dict);
}

五、偏好设置

- (IBAction)saveBtn:(id)sender {
    // 偏好设置是专门用来保存应用程序的配置信息的, 一般情况不要再偏好设置中保存其他数据
    // 如果利用系统的偏好设置来存储数据, 默认就是存储在Preferences文件夹下面的
    // 偏好设置会将所有的数据保存到同一个文件中
    
    // 获取NSUserDefaults对象
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    // 保存数据(如果设置数据之后没有同步, 会在将来某一时间点自动将数据保存到Preferences文件夹下面)
    [defaults setObject:@"lnj" forKey:@"name"];
    [defaults setObject:@"man" forKey:@"gender"];
    [defaults setInteger:13 forKey:@"age"];
    [defaults setDouble:10.1 forKey:@"height"];
    
    // 让NSUserDefaults立刻保存数据
    [defaults synchronize];

}

- (IBAction)readBtn:(id)sender {
    
    // 1.获取NSUserDefaults
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    // 2.通过NSUserDefaults获取保存的数据
    NSString *name = [defaults objectForKey:@"name"];
    int age = [defaults integerForKey:@"age"];
    NSLog(@"%@", name);
    NSLog(@"%d", age);
}

六、归档

person类
person.h

#import <Foundation/Foundation.h>

// 如果想将一个自定义对象保存到文件中必须实现NSCoding协议
@interface Person : NSObject <NSCoding>

@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@property (nonatomic, assign) double height;

@end

person.m

#import "Person.h"

@implementation Person


// 当将一个自定义对象保存到文件的时候就会调用该方法
// 在该方法中说明如何存储自定义对象的属性
// 也就说在该方法中说清楚存储自定义对象的哪些属性
- (void)encodeWithCoder:(NSCoder *)encoder
{
    NSLog(@"Person encodeWithCoder");
    [encoder encodeObject:self.name forKey:@"name"];
    [encoder encodeInteger:self.age forKey:@"age"];
    [encoder encodeFloat:self.height forKey:@"heigth"];
}

// 当从文件中读取一个对象的时候就会调用该方法
// 在该方法中说明如何读取保存在文件中的对象
// 也就是说在该方法中说清楚怎么读取文件中的对象
- (id)initWithCoder:(NSCoder *)decoder
{
    NSLog(@"Person initWithCoder");
    if (self = [super init]) {
        self.name = [decoder decodeObjectForKey:@"name"];
        self.age = [decoder decodeIntegerForKey:@"age"];
        self.height = [decoder decodeFloatForKey:@"heigth"];
    }
    return self;
}

@end

ViewController.m

#import "ViewController.h"
#import "Person.h"

@interface ViewController ()
- (IBAction)saveBtnClick:(id)sender;
- (IBAction)readBtnClick:(id)sender;

@end

@implementation ViewController

- (IBAction)saveBtnClick:(id)sender {
    // 1.创建对象
    Person *p = [[Person alloc] init];
    p.name = @"zhangsan";
    p.age = 28;
    p.height = 1.76;
    // 2.获取文件路径
    NSString *docPath =  [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *path = [docPath stringByAppendingPathComponent:@"stu.xxoo"];
    NSLog(@"path = %@", path);
    
    // 3.将自定义对象保存到文件中
    [NSKeyedArchiver archiveRootObject:p toFile:path];
  
}

- (IBAction)readBtnClick:(id)sender {
    
    // 1.获取文件路径
    NSString *docPath =  [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *path = [docPath stringByAppendingPathComponent:@"stu.xxoo"];

    // 2.从文件中读取对象
    NJPerson *p = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
    
    NSLog(@"%@ %d %.1f %.1f", stu.name, stu.age, stu.height, stu.weight);
}
@end

七、SQLite

八、CoreData

Core Data框架提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite3数据库文件中,也能够将保存在数据库中的数据还原成OC对象。在此数据操作期间,不需要编写任何SQL语句。使用此功能,要添加CoreData.framework和导入主头文件<CoreData/CoreData.h>

上一篇 下一篇

猜你喜欢

热点阅读