一、plist 存储

//获取Plist文件的全路径NSString *path = [[NSBundle mainBundle] pathForResource:@"shops" ofType:@"plist"];//加载plist文件_shops = [NSArray arrayWithContentsOfFile:path];

2、属性列表——归档NSDictionary. 将数据封装成字典,将字典持久化到Documents/stu.plist文件中

NSMutableDictionary *dict = [NSMutableDictionary dictionary];[dict setObject:@"15013141314" forKey:@"phone"];[dict writeToFile:path atomically:YES];

3、属性列表——恢复NSDictionary; 读取Documents/stu.plist的内容,实例化NSDictionary.

NSMutableDictionary *dict = [NSMutableDictionary dictionary];[dict setObject:@"15013141314" forKey:@"phone"];[dict writeToFile:path atomically:YES];

二、UserDefaults ;偏好设置存储

写入需保存的设置

[[NSUserDefaults standardUserDefaults] setFloat:18.0f forKey:@"text_size"]; 

读取上次保存的设置

float textSize = [[NSUserDefaults standardUserDefaults] floatForKey:@"text_size"];

注意:IOS7之前UserDefaults设置数据时,不是立即写入可能还没有写入磁盘应用程序就终止了导致数据丢失,可以通过调用synchornize方法强制写入;

IOS7之后已经实现即时写入,可以省略此步

[defaults synchronize];  //'siŋkrənaiz

三、NSKeyedArchiver 归档存储

系统对象通过NSKeyedArchiver保存与读取数据

归档一个NSArray对象到Documents/array.archive

NSArray *array = [NSArray arrayWithObjects:@”a”,@”b”,nil];[NSKeyedArchiver archiveRootObject:array toFile:path];

恢复(解码)NSArray对象

NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

需要遵守

- (void)encodeWithCoder:(NSCoder *)encoder {

[encoder encodeObject:self.name forKey:@"name"];

[encoder encodeInt:self.age forKey:@"age"];

[encoder encodeFloat:self.height forKey:@"height"];

}

- (id)initWithCoder:(NSCoder *)decoder {

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

self.age = [decoder decodeIntForKey:@"age"];

self.height = [decoder decodeFloatForKey:@"height"];

return self;

}

自定义对象通过NSKeyedArchiver保存与读取数据

1)归档(编码)

Person *person = [[[Person alloc] init] autorelease];

person.name = @"MJ";

person.age = 27;

person.height = 1.83f;

[NSKeyedArchiver archiveRootObject:person toFile:path];

2)恢复(解码)

Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

3)注意

如果父类也遵守了NSCoding协议,应该在encodeWithCoder:方法中加上一句:

[super encodeWithCode:encode];

确保继承的实例变量也能被编码,即也能被归档,应该在initWithCoder:方法中加上一句:

self = [super initWithCoder:decoder];

确保继承的实例变量也能被解码,即也能被恢复.

利用归档实现深复制

//比如对一个Person对象进行深复制,临时存储person1的数据

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:person1];

//解析data,生成一个新的Person对象

Student *person2 = [NSKeyedUnarchiver unarchiveObjectWithData:data];

//分别打印内存地址

NSLog(@"person1:0x%x", person1); // person1:0x7177a60

NSLog(@"person2:0x%x", person2); // person2:0x7177cf0

归档

NSKeyedArchiver专门用来做自定义对象归档

// 什么时候调用:当一个对象要归档的时候就会调用这个方法归档

// 作用:告诉苹果当前对象中哪些属性需要归档

- (void)encodeWithCoder:(NSCoder *)aCoder

{

[aCoder encodeObject:_name forKey:@"name"];

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

}

// 什么时候调用:当一个对象要解档的时候就会调用这个方法解档

// 作用:告诉苹果当前对象中哪些属性需要解档

// initWithCoder什么时候调用:只要解析一个文件的时候就会调用

- (id)initWithCoder:(NSCoder *)aDecoder

{

#warning [super initWithCoder]

if (self = [super init]) {

// 解档

// 注意一定要记得给成员属性赋值

_name = [aDecoder decodeObjectForKey:@"name"];

_age = [aDecoder decodeIntForKey:@"age"];

}

return self;

}

四、SQLite 及FMDB

采用SQLite 数据库来存储数据。SQLitte 作为一个中小型数据库,应用iOS中,跟前几种保存方式相比,相对比较复杂一些,常用框架 FMDB,FMDB 使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码,提供了多线程安全的数据库操作方法,有效地防止数据混乱。

打开数据库

 通过指定SQLite数据库文件路径来创建FMDatabase对象。

FMDatabase *db = [FMDatabase databaseWithPath:path];

if (![db open]) {

NSLog(@"数据库打开失败!");

}

在FMDB中,除查询以外的所有操作,都称为“更新”,create、drop、insert、update、delete等,使用executeUpdate:方法执行更新

- (BOOL)executeUpdate:(NSString*)sql, ...

- (BOOL)executeUpdateWithFormat:(NSString*)format, ...

- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments

// 示例

[db executeUpdate:@"UPDATE t_student SET age = ? WHERE name = ?;", @20, @"Jack"]

执行查询

- (FMResultSet *)executeQuery:(NSString*)sql, ...

- (FMResultSet *)executeQueryWithFormat:(NSString*)format, ...

- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments

// 查询数据

FMResultSet *rs = [db executeQuery:@"SELECT * FROM t_student"];

// 遍历结果集

while ([rs next]) {

NSString *name = [rs stringForColumn:@"name"];

int age = [rs intForColumn:@"age"];

double score = [rs doubleForColumn:@"score"];

}

FMDatabaseQueue的创建

FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];

简单使用

[queue inDatabase:^(FMDatabase *db) {

[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"];

[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Rose"];

[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jim"];

FMResultSet *rs = [db executeQuery:@"select * from t_student"];

while ([rs next]) {

// …

}

}];

使用事务

[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {

[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"];

[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Rose"];

[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jim"];

FMResultSet *rs = [db executeQuery:@"select * from t_student"];

while ([rs next]) {

// …

}

}];

事务回滚

rollback = YES;

鸣谢:智障小鲁班

ios字典存bool_iOS 常见的数据存储方式相关推荐

  1. ios字典存bool_iOS 开发之字典写入文件

    在最近的开发中阿,遇到一个问题,是我开始没有注意到的问题,某个羡慕后期维护的过程中发现一个bug,这个bug就是关于字典写入文件的.缘由是这样的,我用字典写入文件的方法 BOOL result = [ ...

  2. IOS的四种数据存储方式及优劣

    IOS有四种经常使用数据存储方式: 第一种方法:用NSUserDefaults存储配置信息 NSUserDefaults被设计用来存储设备和应用的配置信息.它通过一个工厂方法返回默认的.也是最经常使用 ...

  3. 《iOS取证实战:调查、分析与移动安全》一3.4 数据存储方式

    3.4 数据存储方式 iPhone上的数据以很多方式进行存储.下面的小节涵盖了每一个数据存储的形式以供审查者了解潜在的证据如何定位或恢复. 内部存储: SQLite 数据库文件: 属性列表: 网络: ...

  4. 12 | 存储优化(上):常见的数据存储方法有哪些?

    通过专栏前面我讲的 I/O 优化基础知识,相信你肯定了解了文件系统和磁盘的一些机制,以及不同 I/O 方式的使用场景以及优缺点,并且可以掌握如何在线上监控 I/O 操作. 万丈高楼平地起,在理解并掌握 ...

  5. ios应用数据存储方式(偏好设置)

    iOS开发UI篇-ios应用数据存储方式(偏好设置) 一.简单介绍 很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能 每个应用 ...

  6. android常用的存储方式,Android 常见数据存储方式

    Android 常见数据存储方式有以下三种:1.使用SharedPreferences存储数据:其本质就是一个xml文件,可以保存字符串.布尔值.基础数据.集合等数据.常用于存储较简单的参数设置. 2 ...

  7. android 存储方式简书,Android的多种数据存储方式

    1. 简介 作为一个完整的应用程序,数据存储操作是必不可少的.现在Android的离线缓存就是通过网络良好状态时将从服务器收到的数据保存到本地.Android系统中主要提供了3种方式进行数据存储,分别 ...

  8. alin的学习之路:C语言篇(二)(指针注意事项,数据存储方式,位运算)

    @TOC(指针注意事项,数据存储方式,位运算) 1.空指针和野指针 不要操作野指针和空指针 空指针: 不要去操作空指针,对空指针指向的内存赋值等操作 void test01() {char* p = ...

  9. Kooboo CMS技术文档之三:切换数据存储方式

    切换数据存储方式包括以下几种: 将文本内容存储在SqlServer.MySQL.MongoDB等数据库中 将站点配置信息存储在数据库中 将后台用户信息存储在数据库中 将会员信息存储在数据库中 将图片. ...

最新文章

  1. oracle 生成目录树,jQuery zTree插件快速实现目录树
  2. 【小白学习PyTorch教程】十一、基于MNIST数据集训练第一个生成性对抗网络
  3. Html爱情表白动画
  4. python3爬取咪咕音乐榜信息(附源代码)
  5. weblogic忘记console密码
  6. 创建多个虚拟环境 windows python Anacoda tensorflow
  7. spring mvc Spring Data Redis RedisTemplate [转]
  8. 程序员如何更好地获取用户信息?
  9. ListView一些特殊属性
  10. 帮公司人事MM做了个工资条拆分工具
  11. 修改docker时区为北京时间
  12. 百练oj2816:红与黑
  13. 数据科学总纲:欲练此功,必过此纲
  14. Python-Level1-day16:异常处理try-exceptraise语句,for迭代原理,深入手写创建迭代器;yield浅出使用生成器
  15. CUDA编程——GPU架构,由sp,sm,thread,block,grid,warp说起
  16. XSS注入进阶练习篇(三) XSS原型链污染
  17. 基于C++的UKF代码示例,跟踪三次多项式曲线
  18. 2021-2022-2-第7次单元练习后记
  19. NCAE(全国工业和信息化应用人才考试 )-- 服务外包 JAVA 软件开发复习整理(一)
  20. quartusii verilog语言create bsf文件的问题

热门文章

  1. 3.深度学习的实用层面
  2. 又到开学季 学习神器走一波 物联网开发板
  3. Maven学习(三)-----Maven本地资源库
  4. iOS中的UIView的基本属性1
  5. shell中的括号(小括号,大括号/花括号)
  6. 问题-[Delphi]用LoadLibrary加载DLL时返回0的错误
  7. 新手如何入门PyTorch
  8. [linux]CentOS安装pre-built Nginx
  9. Android开发学习之路-机器学习库(图像识别)、百度翻译
  10. php基础01~命名、传值问题