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结合,原理是什么?

你可能感兴趣的:(iOS中的数据持久化)