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

原创 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 ...
  • matiji66
  • matiji66
  • 2016年06月09日 16:57
  • 832

数据本地化存储

在程序开发中,数据层永远是程序的核心结构之一。我们将现实事物进行抽象,使之变成一个个数据。对这些数据的加工处理是代码中能体现技术水平的一大模块,比如数据的请求、解析、缓存、持久化等等。适当的对数据进行...
  • LiMi512
  • LiMi512
  • 2016年07月05日 10:17
  • 334

C语言 大文件读写

http://blog.chinaunix.net/u1/33412/showart_397173.html 内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存...
  • u010258235
  • u010258235
  • 2015年05月06日 12:48
  • 617

使用FMDB事务批量更新数据库速度问题

通常一次 sqlite3_exec 就是一次事务,假如你要对数据库中的Stutent表插入新数据,那么该事务的具体过程是:开始新事物->插入数据->提交事务,那么当我们要往该表内插入500条数据,如果...
  • x32sky
  • x32sky
  • 2014年02月07日 16:42
  • 6771

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

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

hadoop 如何做到map任务本地化

Hadoop继承了Google的MapReduce的特性,具有map任务最大化本地化的能力,下面具体说下它是如何做到的。在hadoop中,有很多taskScheduler,这里以默认的JobQueue...
  • dboy1
  • dboy1
  • 2011年03月17日 16:48
  • 4961

Git 教程 - Git 基本用法

Git 教程 - Git 基本用法 您的评价:        收藏该经验 Git 是当前最流行的版本控制程序之一,文本包含了 Git...
  • javafreely
  • javafreely
  • 2014年01月13日 11:10
  • 51759

所处理的数据在什么地方 有多长 如何定义 如何寻找

处理的数据在什么地方: 立即数(idata)1,3,10,3F 寄存器AX,AL,BX 内存单元,可用寻址方式给出DS:[idata],ds:[0]处理的数据有多长: MOV AX,1 ;字操作 MO...
  • u010976120
  • u010976120
  • 2013年06月12日 14:28
  • 625

Hadoop数据本地化

首先需要知道,hadoop数据本地化是指的map任务,reduce任务并不具备数据本地化特征。       通常输入的数据首先将会分片split,每个分片上构建一个map任务,由该任务执行执行用户自...
  • qq_36864672
  • qq_36864672
  • 2017年11月08日 09:43
  • 128

Spark性能调优之——在实际项目中调节数据本地化等待时长

PROCESS_LOCAL:进程本地化, 代码和数据在同一个进程中,也就是在同一个executor中;计算数据的task由executor执行,数据在executor的BlockManage...
  • lxhandlbb
  • lxhandlbb
  • 2016年10月31日 22:27
  • 957
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据本地化存储 如何选择?
举报原因:
原因补充:

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