注:借鉴于:http://blog.csdn.net/jianjianyuer/article/details/8556024

在IOS开发过程中,不管是做什么应用,都会碰到数据保存问题。将数据保存到本地,能够让程序更加流畅,不会出现让人厌恶的菊花状,使得用户的体验更好。下面是介绍数据保存的方式

第一、NSKeyedArchiver:采用归档的形式来保存数据。(归档——解档)———大量数据和频繁读写不合适使用

1、归档器的作用是将任意的对象集合转换为字节流。这听起来像是NSPropertyListSerialization类采用的过程,但是它们之间有一个重要的区别。属性列表序列化只能转换一个有限集合的数据类型(大多是数量类型),而归档可以转换任意的OC对象、数据类型、数组、结构、字符串以及更多其他类型。

2、Foundatio框架支持两种归档器。顺序归档和基于键的归档。基于键的归档器更加灵活,是应用程序开发中推荐使用的归档器 。

3、一个面向对象程序在运行的时候,一般都创建了一个复杂的对象关系图,经常需要把这样一个复杂的对象关系图表示成字节流,这样的过程叫做          Archiving.

4、而当从字节流中重新恢复对象关系图的过程叫做unarchive。

5、NSCoder是archivie字节流的抽象类。

6、对一个对象归档需要满足的条件是:该对象的类必须实现NSCoding协议

归档、

-(int)create:(Note *)model{NSString *homeDictionary = NSHomeDirectory();NSString *path = [homeDictionary stringByAppendingPathComponent:FILE_NAME];NSFileManager *fileManager = [NSFileManager defaultManager];BOOL isexists = [fileManager fileExistsAtPath:path];NSMutableArray *array = [[NSMutableArray alloc] init];[array addObject:model];//archive归档NSMutableData *theData = [NSMutableData data];NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:theData];[archiver encodeObject:array forKey:ARCHIVE_KEY];[archiver finishEncoding];[theData writeToFile:path atomically:YES];//    [array writeToFile:path atomically:YES];return 0;}

解档、

-(NSMutableArray *)findAll{NSString *homeDictionary = NSHomeDirectory();NSString *path = [homeDictionary stringByAppendingPathComponent:FILE_NAME];NSMutableArray *listData = [[NSMutableArray alloc] init];NSData *theData = [NSData dataWithContentsOfFile:path];if([theData length]>0){NSKeyedUnarchiver *archiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:theData];listData = [archiver decodeObjectForKey:ARCHIVE_KEY];[archiver finishDecoding];}return listData;}

第二、NSUserDefaults

//自动登陆用到的+(id)configForKey:(NSString *)key{NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];return [defaults objectForKey:key];}//写入内容+(void)setLoginConfig:(id)value forKey:(NSString *)key{NSUserDefaults *user = [NSUserDefaults standardUserDefaults];[user setObject:value forKey:key];[user synchronize];   //及时强制写入}//读出内容+(NSString *)getLoginConfig:(NSString *)key{NSString *s = [Globle  configForKey:key];if(s==nil){return @"";}return s;}

第三、write写入磁盘

第一步:获得文件即将保存的路径:

NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask,YES);//使用C函数NSSearchPathForDirectoriesInDomains来获得沙盒中目录的全路径。该函数有三个参数,目录类型、he domain mask、布尔值。其中布尔值表示是否需要通过~扩展路径。而且第一个参数是不变的,即为NSSearchPathDirectory 。在IOS中后两个参数也是不变的,即为:NSUserDomainMask 和 YES。
NSString *ourDocumentPath =[documentPaths objectAtIndex:0];

还有一种方法是使用NSHomeDirectory函数获得sandbox的路径。具体的用法为:

NSString *sandboxPath = NSHomeDirectory();
// Once you have the full sandbox path, you can create a path from it,但是不能在sandbox的本文件层上写文件也不能创建目录,而应该是此基础上创建一个新的可写的目录,例如Documents,Library或者temp。
NSString *documentPath = [sandboxPath
            stringByAppendingPathComponent:@"Documents"];//将Documents添加到sandbox路径上,具体原因前面分析了!

这两者的区别就是:使用NSSearchPathForDirectoriesInDomains比在NSHomeDirectory后面添加Document更加安全。因为该文件目录可能在未来发送的系统上发生改变。

第二步:生成在该路径下的文件:

NSString *FileName=[documentDirectory stringByAppendingPathComponent:fileName];//fileName就是保存文件的文件名

第三步:往文件中写入数据:

[data writeToFile:FileName atomically:YES];//将NSData类型对象data写入文件,文件名为FileName

最后:从文件中读出数据:

NSData data=[NSData dataWithContentsOfFile:FileName options:0 error:NULL];//从FileName中读取出数据

第四、SQLite数据库

 @interface BaseViewController (){sqlite3 *sqlDataBase;}@end@implementation BaseViewController- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];if (self) {// Custom initialization}return self;}- (void)viewDidLoad{[super viewDidLoad];if ([self createOrOpen:@"test.db"]) {//        [self createUserTable:sqlDataBase];//        [self insertMBkey:nil];NSMutableArray *s = [NSMutableArray new];[self GetList:s];NSLog(@"%@",s);}else{NSLog(@"FAIL");}}

/***该函数主要打开数据库myDataBase.sql,如果该数据库不存在,则进行创建*打开或者创建成功返回yes,否则返回false,参数dbName是数据库的名称**/-(BOOL)createOrOpen:(NSString *)dbName{//获取用户域覆径信息NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocuemntDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];/***Users/admin/Library/Application Support/iPhone Simulator/7.1/Applications/8E23557E-AAA6-471A-AAFE-E036BF1B7E4C/Library/Documentation*判断用户域是否有数据库dbNmae*/NSString *path = [documentsDirectory stringByAppendingPathComponent:dbName];NSFileManager *fileManageer = [NSFileManager defaultManager];//如果用户域内有该数据库,则返回yes,否则返回NOBOOL find = [fileManageer fileExistsAtPath:path];if(find)   //对找到进行处理,如果找到了,并且打开了,则返回yes{//打开该数据库,如果打开失败,则返回NO,否则返回yesif(sqlite3_open([path UTF8String], &sqlDataBase)!= SQLITE_OK){//关闭sqlDataBase,实际是释放了它sqlite3_close(sqlDataBase);return NO;}return YES;}NSLog(@"%d",sqlite3_open([path UTF8String], &sqlDataBase));//创建数据库,创建返回yes,并且打开数据库,否则返回NOif(sqlite3_open([path UTF8String], &sqlDataBase)==SQLITE_OK){return YES;}else{//关闭sqlDataBase,实际是释放了它sqlite3_close(sqlDataBase);return NO;}return NO;
}
//在打开的数据库中创建表,其中sqldb为成功打开的数据库的sqlite3对象
-(BOOL)createUserTable:(sqlite3 *)sqlDataBas{//设置sql语句char *sql = "create table user(id integer primary key, name text, address text, imageData BLOB, imageLen integer)";sqlite3_stmt *statement;  //这个相当于ODBC的Command对象,用于保存编译好的SQL语句//进行预处理,预处理失败返回NOif(sqlite3_prepare_v2(sqlDataBase, sql, -1, &statement, nil)!=SQLITE_OK){return NO;}//预处理成功,进行执行创建操作int success = sqlite3_step(statement);sqlite3_finalize(statement);if(success !=SQLITE_DONE){return NO;}return YES;}//向表中插入数据-(void)insertMBkey:(NSString *)key{BOOL isOK = NO;sqlite3_stmt *statement;static char *sql = "INSERT INTO user VALUES ('1', 'Bill', '河南', 'ssss','2')";int success = sqlite3_prepare_v2(sqlDataBase, sql, -1, &statement, NULL);if(success !=SQLITE_OK){isOK = NO;}else{sqlite3_bind_text(statement, 1, [key UTF8String], -1, SQLITE_TRANSIENT);success = sqlite3_step(statement);sqlite3_finalize(statement);}if(success ==SQLITE_ERROR){isOK = NO;}else{isOK=YES;}return;}//查询数据-(void)GetList:(NSMutableArray *)KeysList{BOOL  isOK = NO;sqlite3_stmt *statement;static char *sql = "select id,address from user";int success = sqlite3_prepare_v2(sqlDataBase, sql, -1, &statement, NULL);if(success !=SQLITE_OK){isOK = NO;}else{//查询结果集中一条一条地遍历所有记录,这里的数字对应的时列值while (sqlite3_step(statement)==SQLITE_ROW) {int kid = sqlite3_column_int(statement, 0);char *key = (char  *)sqlite3_column_text(statement, 1);UserInfo *userModel = [[UserInfo alloc] init];userModel.userId =kid;if (key) {userModel.userAddress = [NSString stringWithUTF8String:key];}[KeysList addObject:userModel];sqlite3_finalize(statement);}NSLog(@"%@",KeysList);if(success==SQLITE_ERROR){isOK = NO;}else{isOK = YES;}return;}}

转载于:https://www.cnblogs.com/zhanggui/p/3927986.html

IOS数据本地存储的四种方式--相关推荐

  1. 浏览器本地存储的四种方式

    浏览器的本地存储主要分为Cookie.WebStorage和IndexedDB,其中WebStorage又分为localStorage(本地存储)和sessionStorage(会话存储),下面我们一 ...

  2. ios页面间传递参数四种方式

    ios页面间传递参数四种方式 1.使用SharedApplication,定义一个变量来传递. 2.使用文件,或者NSUserdefault来传递 3.通过一个单例的class来传递 4.通过Dele ...

  3. jdbc连接数据scanip_JDBC连接数据库的四种方式:DriverManager,DataSource,DBCP,C3P0

    方法1:使用java.sql.DriverManager类 驱动管理器类,用于管理所有注册的驱动程序. (注:DataSource 接口是 JDBC 2.0 API 中的新增内容,它提供了连接到数据源 ...

  4. 安卓androidstudio访问本地接口_安卓开发之数据存储在本地的四种方式

    ​ 安卓开发之数据存储在本地的四种方式 本地数据存储,在安卓开发过程中是不可避免的一个话题.这些本地的数据可能是用户的设置,程序的设置,用户的数据图片, 也可能是网络传输的一些缓冲数据. 基本上我们有 ...

  5. 解决存储过程中数据安全问题的四种方式

    随着科技的不断发展,数据量也正在呈指数倍的增加.在这样一个大背景下,存储产品成为了时下市场中最热的产品.而数据的安全性也变得尤为重要.后端存储已经逐渐成为企业业务系统的核心和关键. 一般而言,我们有四 ...

  6. linux数据同步技术比较,linux下实现web数据同步的四种方式(性能比较)教程.docx

    linux下实现web数据同步的四种方式(性能比较)教程 实现web数据同步的四种方式=======================================1.nfs实现web数据共享2.rs ...

  7. linux下实现web数据同步的四种方式(性能比较)

    实现web数据同步的四种方式 ======================================= 1.nfs实现web数据共享 2.rsync +inotify实现web数据同步 3.rs ...

  8. 实现web数据同步的四种方式

    实现web数据同步的四种方式 ======================================= 1.nfs实现web数据共享 2.rsync +inotify实现web数据同步 3.rs ...

  9. 连续分配存储的四种管理方式

    连续分配存储的四种管理方式 连续分配方式指为一个用户程序分配给一个连续的内存空间 单一连续分配 原理:将内存分为用户区和系统区,每次运行时,都将整个用户区分配给当前执行的一道作业 固定分区分配 原理: ...

最新文章

  1. Mono项目宣布将整合F#
  2. tesseract-ocr使用以及训练方法
  3. SAP,IBM,AC实施之比较
  4. AJAX初识(原生JS版AJAX和Jquery版AJAX)
  5. easyui前端框架模板_.NET Core基于Ace Admin的响应式框架
  6. Android音视频之AudioRecord录音(一)
  7. JavaScript中的面向对象--对象创建
  8. spss主成分综合得分_权重赋值之“主成分分析法”
  9. python遍历目录压缩文件夹_zip包含一个档案文件夹,如何使用Python获取存档中每个zip的注释?...
  10. 二阶系统 matlab,线性二阶系统性能的MATLAB仿真.pdf
  11. 单片机技术应用实训考核,AT89S52单片机应用教学,QY-KC20
  12. html图片闪现循环效果,CSS实现图片无缝无限循环展示效果
  13. 【发际线大作战】C++学习记录之循环语句(发际线-1cm)
  14. thinkphp的column()函数
  15. 【经典算法】:银行金额大写转换
  16. Word2019版_去掉文档中的回车符
  17. js中Object.freeze()函数的作用
  18. 从云计算到固态硬盘 颠覆性技术成熟度分析
  19. 手持PDA操作系统有哪些?哪个系统好?
  20. 使用广播信道的数据链路层相关知识点

热门文章

  1. easyui 修改单元格内容_jquery easyui datagrid实现增加,修改,删除方法总结
  2. 华为管理学案例分析_管理学论文5000字如何高质量写作
  3. python部署thrift服务以及客户端
  4. httpClient中的三种超时时间设置
  5. NBIA Data Retriever(NBIA数据下载工具)使用
  6. ssh 框架搭建出现错误
  7. 09_期望极大法EM1_统计学习方法
  8. PWDX查找程序执行路径
  9. js延迟加载优化页面响应速度
  10. Android 图片相关整理