数据本地化存储 如何选择?

原创 2016年06月02日 09:44:10

0.数据本地化存储的方案选择

  • 1.plist存储:只支持数组和字典的存储.plist文件也可以存储,但是会改变文件格式.

  • 2.沙盒:

    • Documents:我们需要操作的目录,备份的时候也会自动备份.只有用户生成的文件、其他数据及其他程序不能重新创建的文件,应该保存在该目录下面,并将通过iCloud自动备份.

    • Library/Caches:缓存.可以重新下载或者重新生成的数据.

    • Library/Preference:偏好设置,由系统自动管理,适合比较少量的数据.

    • tmp:随时有可能被删除

1.plist存储

// 宏定义, 直接根据文件名称, 拼接文件的绝对路径,
#define kFilePath(fileName) ([NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:fileName])


#pragma mark - 写入文件
- (IBAction)writToFile:(id)sender {
    NSString *filePath = kFilePath(@"cc.plist");

    NSString *tempString = @"哈勒路亚";

    // 把string 写到 文件当中
    [tempString writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];

}


#pragma mark - 读取内容,读取字符串的内容
- (IBAction)readFromFile:(id)sender {

   NSString *tempString = [NSString stringWithContentsOfFile:kFilePath(@"cc.plist") encoding:NSUTF8StringEncoding error:nil];

    NSLog(@"%@", tempString);

}

2.用户偏好设置:preference

#pragma mark - 写入文件
- (IBAction)writToFile:(id)sender {
   // 用户偏好
  NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

 // 保存用户名
    [defaults setObject:@"dd" forKey:@"name"];

    // 保存年龄
    [defaults setInteger:18 forKey:@"age"];

    // 是否已婚
    [defaults setBool:YES forKey:@"married"];

#warning 写入完数组之后, 要做一次同步
    [defaults synchronize];

}


#pragma mark - 读取内容
- (IBAction)readFromFile:(id)sender {

    // 取值

    NSString *name = [[NSUserDefaults standardUserDefaults] objectForKey:@"name"];

    NSInteger age = [[NSUserDefaults standardUserDefaults] integerForKey:@"age"];

    BOOL married = [[NSUserDefaults standardUserDefaults] boolForKey:@"married"];


    NSLog(@"name: %@, age: %ld, married: %d", name, age, married);
}


3.归档解档:

  • 1.归档解档可以针对所有的对象 : 必须要遵守协议 NSCoding

  • 2.归档原理:首先通过[NSKeyedArchiver archiveRootObject:XXX]来对对象进行归档,但是这个方法可没那么牛叉,类中的属性还是需要在自定义的类中 通过重写 - (void)encodeWithCoder:(NSCoder *)acoder;来实现的.

  • 3.解档原理:首先通过[NSKeyedUnarchiver unarchiveObjectWithFile:...]返回一个解档出来的类对象,前面归档进去的是什么类型的对象,解档出来的对象就用什么类型去接收.同样,这个方法也没那么牛叉,具体的类的属性需要在自定义的类中重写- (instancetype)initWithCoder:(NSCoder *)aDecoder这个方法来实现.

  • 4.如果存储的只是简单的数据类型,数组.字典啥的,那就不需要encodeWithCoder 和 initWithCoder了.

归档数组:  [NSKeyedArchiver archiveRootObject:self.dataArray toFile:kFilePath(@"user.data")];

解档数组:  NSMutableArray *tempArray  = [NSKeyedUnarchiver unarchiveObjectWithFile:kFilePath(@"user.data")];
  • 归档类的具体各个步骤实现的代码见下面:

#pragma mark - 写入文件
- (IBAction)writToFile:(id)sender {
  // 归档 , 是写入到文件


    // 创建对象
    Person *person = [Person new];

    person.name = @"dd";

    person.age = 26;

    /**
     archiveRootObject: 要进行归档的对象,注意这里是针对一个类进行归档,但是这方法可不是真的那么厉害的.类中的属性还是需要自己在自定义的类中重写这个方法:- (void)encodeWithCoder:(NSCoder *)aCoder来实现对每个数据进行归档.
     toFile:  文件路径
     */
    [NSKeyedArchiver archiveRootObject:person toFile:kFilePath(@"user.data")];

}



/**
 对数据进行归档

 要对哪些属性进行归档
 */
- (void)encodeWithCoder:(NSCoder *)aCoder {

    // 进行归档 也就是 把数据写入到文件

    // 把_name 转为 NSCoder 这种类型的对象中的值
    [aCoder encodeObject:_name forKey:@"name"];

    [aCoder encodeInteger:_age forKey:@"age"];

}



/**
 进行解档数据
 */
- (instancetype)initWithCoder:(NSCoder *)aDecoder {

    if (self = [super init]) {

        // 解码, 把NSCoder 中的 key 对应的value 赋值给  和 key 值相当的属性

        self.name = [aDecoder decodeObjectForKey:@"name"];

        self.age = [aDecoder decodeIntegerForKey:@"age"];

    }

    return self;

}


数据本地化级别

Property Name Default Meaning       spark.locality.wait 3s How long to wait to launch a ...

几种常用的本地化存储方式

概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据。在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(...

数据本地化存储之NSUserdefaults,plist文件,归档解档,数据库sqlite(FMDB)

数据本地化存储 一.文件 sandbox NSHomeDirectory(); 二.plist 属性文件 Plist本质上是一个xml文件,来保存我们的数据 -------------写入pl...

iOS开发————数据本地化存储方式之Keychain

iOS的keychain服务提供了一种安全的保存私密信息(密码,序列号,证书等)的方式,每个ios程序都有一个独立的keychain存储。相对于NSUserDefaults、文件保存等一般方式,key...

IOS开发中关于数据的本地化存储

对于IOS开发者而言, 项目中数据的本地化存储,最难的一点,莫过于SQL语句的编写,除此之外, 其实也没什么难度, 当然在创建数据库之前,我们必须要做的是对数据进行分析, 然后对FMDB进行简单的封装...

本地化网络数据,存储到本地,若没有网络时显示本地数据

在网络状态下从网络获取数据,把每次获取到的数据存入本地.plist文件,再次打开时首先判断是否有网,若没有网络,则从本地获取之前下载的数据,若有网,则刷新数据,同时把本次加载的数据覆盖原来的.plis...

本地化存储

  • 2013年08月17日 13:42
  • 21KB
  • 下载

线程本地化存储(Thread Local Storage)示例2则

TLS:Thread Local Storage   TLS全称为Thread Local Storage,是Windows为解决一个进程中多个线程同时访问全局变量而提供的机制。TLS可以简单地由操...
  • jiht594
  • jiht594
  • 2011年08月31日 22:57
  • 2371

Android本地化存储Cookie(针对HttpClient)

因为最近有人问我怎么保存HttpClient的Cookie, 所以这里写下, 顺便记录总结吧. 当然, 有Android网络编程经历的童鞋一看就懂喇~  就不多说了, 直接上代码: /**...
  • stzy00
  • stzy00
  • 2015年07月08日 17:54
  • 1825

本地化,数据库存储

1.NSUserDefaults简介 1.1  NSUserDefaults是一个单例,在整个程序中只有一个实例对象,他可以用于数据的永久保存, 它支持的数据类型有:NSNumber(NSIntege...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据本地化存储 如何选择?
举报原因:
原因补充:

(最多只允许输入30个字)