iOS中的数据持久化

iOS中的数据持久化(1): NSUserDefault简单数据快速读写

系统提供的这种简单键值对数据存储在各平台基本都有,添加新数据时要自定义一个key字符串,然后同时添加一个基本类型的数据,支持的数据类型有:NSNumber(Integer、Float、Double等),NSString,NSDate,NSArray,NSDictionary,BOOL。之后需要通过自定义的key来获取存储的数据。获取数据时,如果key值不存在则会返回一个默认值(0或者-1)。

虽然存储的是简单数据,但也可以用来存储集合数据,开发中一般是将集合数据(例如:字典、数组及其组合)转化成JSON字符串,以NSString字符串的形式来保存,这样也便于加密解密。

    /* 获取NSUserDefaults标准函数对象 */
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    /* 存储新对象数据或更新对象数据 */
    [defaults setObject:@"data" forKey:@"key1"];
    /* 通过key值取出对象数据 */
    [defaults objectForKey:@"key1"];
    
    /* 其他类型的数据存取: */
    [defaults setDouble:3.1415926 forKey:@"double1"]; //添加double类型数据     [defaults doubleForKey:@"double1"];               //获取double类型数据     
    [defaults setBool:NO forKey:@"bool1"];            //添加BOOL类型数据     [defaults boolForKey:@"bool1"];                   //获取BOOL类型数据     
    [defaults setInteger:2016 forKey:@"int1"];        //添加int类型数据     [defaults integerForKey:@"int1"];                 //获取int类型数据     
    [defaults setFloat:3.14 forKey:@"float1"];        //添加Float类型数据     [defaults floatForKey:@"float1"];                 //获取float类型数据     
    [defaults removeObjectForKey:@"key1"];            //删除对象数据

iOS中的数据持久化(2): 属性列表Property list文件存储

Plist文件
Property List,属性列表文件,文件后缀名为.plist因此常叫做plist文件。plist文件主要用来存储串行化后的对象,文件是xml格式的,常用于储存用户设置,也可以用于存储捆绑的信息等。
明确保存位置
在使用plist文件存储前先要明确数据的不同存储位置。

存储到应用沙盒【可读可写】: 沙盒是应用的一个隔离区域,plist文件存储在沙盒的Document文件目录下,类似于Java中的文件读写。写入时要指明plist文件的文件名,例如:“/demo.plist”,其中的‘/’不可忘记添加,因为是要添加路径。如果是新写入的plist文件,则会在Document目录下创建demo.plist这个文件,并写入数据;如果文件已经存在,则会覆盖已经存在的plist文件实现数据更新(等效于我们将同名文件拖入文件夹进行替换)。
存储到应用工程本身【只可读】: 如果是将数据存在工程里,那么plist数据文件是要手工创建的,而非代码添加,代码只可以对手工创建的plist文件进行读取且不可更新,更新只能通过手动修改plist文件更新数据。
读取工程plist文件并写入沙盒以及读取沙盒plist文件

首先手动创建一个简单的plist文件:File —> New—> NewFile,选择Resource下的PropertyList,plist文件(root)可以是一个不可变数组(NSArray),也可以是一个字典(NSDictionary)。一般情况下是一个数组,存储多条数据。这里创建了一个文件名为‘test.plist’的plist文件,Root是一个Dictionary字典,存储几个键值对。


43.png

下面示例代码实现读取工程中上面手动创建的test.plist文件,对读取的数据进行更新,然后将更新的数据写入沙盒,然后读取沙盒的数据(读取沙盒数据后可以再更新然后再重新写入):

    /* 1.读取工程中的plist文件,这里设置的工程的plist是一个Dictionary字典,也可以用Array数组plist */
    NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"test" ofType:@"plist"]];
    NSLog(@"从工程plist读取的数据:%@",data);
    
    /* 添加新数据到字典对象中 */
    [data setObject:@"4444" forKey:@"d"];
    NSLog(@"将要写入沙盒的数据:%@",data);
    
    /* 获取沙盒路径,这里"/demo.plist"是指新建的沙盒里plist文件路径,一定要加“/”!!! */
    NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) lastObject] stringByAppendingPathComponent:@"/demo.plist"];
    /* 2.将更新了的工程中的数据写入沙盒 */
    [data writeToFile:filePath atomically:YES];
    
    /* 3.读取沙盒数据 */ 
    NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];
    NSLog(@"从沙盒读取的数据:%@",dic);

iOS中的数据持久化(3): Archive归档

归档反归档又叫序列化和反序列化,用法和本地文件存储类似,不过归档反归档经过了复杂对象和NSData数据类型的相互转换,可以存储复杂对象。使用NSKeyedArchiver和NSKeyedUnarchiver类的类方法即可简单进行单一对象的归档和反归档操作。若要实现多个对象的同时归档和反归档则要自定义并初始化一个NSKeyedArchiver对象,将数据封装在NSMutableData中进行统一归档和反归档。

单一对象归档:

/* 沙盒根目录 */
NSString *homeDictory = NSHomeDirectory();
/* 拼接根目录和自定义文件名构建存储路径 */
NSString *homePath = [homeDictory stringByAppendingPathComponent:@"testAchiver"];
/* 待归档的数组,也可归档NSString、NSInteger等基础对象类型 */
NSArray *array = @[@"obj1",@"obj2",@"obj3"];
/* 归档并返回归档是否成功 */
BOOL flag = [NSKeyedArchiver archiveRootObject:array toFile:homePath];
NSArray *unarchivedArray;
/* 如果归档成功则解归档 */
if (flag) {
    unarchivedArray = [NSKeyedUnarchiver unarchiveObjectWithFile:homePath];
}
NSLog(@"%@",unarchivedArray);
2017-04-08 12:07:28.180332 CommandLine[65032:4610773] (
    obj1,
    obj2,
    obj3
)

多对象归档:

/* 归档路径 */
NSString *homeDictory = NSHomeDirectory();
NSString *homePath = [homeDictory stringByAppendingPathComponent:@"testAchiver"];

/* 待归档的数据 */
NSInteger intVal = 1;
NSString *strVal = @"string";
CGPoint pointVal = CGPointMake(1.0, 1.0);
/* 初始化归档工具 */
NSMutableData *mulData = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:mulData];
/* 归档 */
[archiver encodeInteger:intVal forKey:@"key_integer"];
[archiver encodeObject:strVal forKey:@"key_string"];
[archiver encodePoint:pointVal forKey:@"key_point"];
[archiver finishEncoding];

/* 归档的数据写入 */
[mulData writeToFile:homePath atomically:YES];

/* 解归档 */
NSMutableData *undata = [[NSMutableData alloc]initWithContentsOfFile:homePath];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:undata];
CGPoint unpointVal = [unarchiver decodePointForKey:@"key_point"];
NSString *unstrVal = [unarchiver decodeObjectForKey:@"key_string"];
NSInteger unintegerVal = [unarchiver decodeIntegerForKey:@"key_integer"];
[unarchiver finishDecoding];
NSLog(@"%f,%f,%@,%ld",unpointVal.x,unpointVal.y,unstrVal,(long)unintegerVal);
2017-04-08 12:04:26.738925 CommandLine[64998:4609662] 1.000000,1.000000,string,1

iOS中的数据持久化(4): Sqlite本地数据库

iOS中的Sqlite是一个使用ANSI-C开发的自包含的关系型数据库,可以用于存储大规模的数据。Sqlite的操作管理很简单,有小巧、快速、可靠的特点。另外Sqlite使用互斥来保证多线程环境下数据操作的安全性。

由于Sqlite源码就是一个叫做sqlite3.c的文件,在工程中引入使用时只要加入这个库文件同时在代码中引入sqlite.h头文件即可。

iOS中的数据持久化(5): Core Data

Core Data是iOS5之后苹果官方提供的一种应用数据管理框架,可以用图形界面的方式快速的定义app的数据模型,同时在代码中很容易获取这些数据模型。Core data提供了基础结构用于处理常用的功能,例如保存,恢复,撤销和重做,允许在app中继续创建新的任务。在使用Core Data的时候,不需要安装额外的数据库系统,因为Core Data使用内置的sqlite数据库。Core Data将app的模型层放入到一组定义在内存中的数据对象中,Core Data会追踪这些对象的改变,同时可以根据需要做相反的改变,例如用户执行撤销命令。当Core Data在对app数据的改变进行保存的时候,Core Data会把这些数据归档,并永久性保存。

Core Data的最本质特点是提供了一种将对象模型和关系数据进行映射的功能,称之为对象-关系映射(ORM),可以将模型对象转化成关系数据以保存到Sqlite数据库中,也可以将保存在Sqlite数据库中的关系型数据转换成模型对象。

问题:iOS平台怎么做数据的持久化? Coredata和Sqlite有无必然联系?Coredata是一个关系型数据库吗?

iOS中可以有四种持久化数据的方式:属性列表、对象归档、SQLite3和Core Data;

Sqlite是一个轻量级功能强大的关系数据引擎,可以很容易嵌入到应用程序,可以在多个平台使用。Sqlite是一个轻量级的嵌入式sql数据库编程。与Core Data框架不同的是,sqlite是使用程序式的,sql的主要的API来直接操作数据表。

Core Data不是一个关系型数据库,也不是关系型数据库管理系统(RDBMS)。虽然Core Data支持SQLite作为一种存储类型,但它不能使用任意的SQLite数据库。Core Data在使用的过程中自己创建这个数据库。Core Data支持对一、对多的关系。

问题: 什么是NSManagedObject模型?

NSManagedObject是NSObject的子类,也是CoreData的重要组成部分,它是一个通用的类,实现了CoreData模型层所需的基本功能,用户可通过子类化NSManagedObject,建立自己的数据模型。

问题: 什么是NSManagedobjectContext? 描述一下管理对象上下文和它提供的方法。

NSManagedobjectContext对象负责应用和数据库之间的交互。

问题: 什么是序列化或者Acrchiving,可以用来做什么,怎样与copy结合,原理是什么?

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容