数据存储的核心都是写文件。
在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题。将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊花形状,使得用户体验更好。下面介绍一下数据保存的方式:
主要的工具有:** NSKeyedArchiver,NSUserDefaults,Write写入方式,SQLite/CoreData **
一、NSKeyedArchiver
对象序列化(对象归档):对象序列化通过序列化的形式,键值关系存储到本地,转化成二进制流。可通过runtime实现自动化归档/解档。实现NSCoding协议必须实现的两个方法:
1.编码(对象序列化):把不能直接存储到plist文件中得到数据,转化为二进制数据,NSData,可以存储到本地;
2.解码(对象反序列化):把二进制数据转化为本来的类型。
二.NSUserDefaults
用来保存应用程序设置和属性、用户保存的数据。用户再次打开程序或开机后这些数据仍然存在。NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。如果要存储其他类型,则需要转换为前面的类型,才能用NSUserDefaults存储。
三.Write写入方式
- 永久保存在磁盘中。属性列表中只有NSString、NSArray、NSDictionary、NSData可writeToFile。此种一半是存储在沙盒中。
使用方法:
第一步:获得文件即将保存的路径:
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
NSString *ourDocumentPath =[documentPaths objectAtIndex:0];
第二步:生成在该路径下的文件:
//fileName就是保存文件的文件名
NSString *FileName=[documentDirectory stringByAppendingPathComponent:ourDocumentPath];
第三步:往文件中写入数据:
//将NSData类型对象data写入文件,文件名为FileName
[data writeToFile:FileName atomically:YES];
最后:从文件中读出数据:
//从fileName中读取文件
NSData data=[NSData dataWithContentsOfFile:FileName options:0 error:NULL];
- 还有一种写入存储的类型是plist文件。 而plist文件可以存储的7中数据类型:array、dictionary、string、bool、data、date、number。
四.SQLite/CoreData
SQLite 数据库:大量有规律的数据使用数据库。
SQLite作为一中小型数据库,应用ios中,跟前三种保存方式相比,相对比较复杂一些。还是一步步来吧!CoreData :通过管理对象进行增、删、查、改操作的。它不是一个数据库,不仅可以使用SQLite数据库来保持数据,也可以使用其他的方式来存储数据。如:XML。(CoreData存取相较于Sqlite的功能更强大一些,对于一些普通的开发而言,常用的是SQLite)
下面简单介绍一下我们不常用的CoreData的存储方式,已便了解。
CoreData的介绍:
CoreData是面向对象的API,CoreData是iOS中非常重要的一项技术,几乎在所有编写的程序中,CoreData都作为数据存储的基础。
CoreData是苹果官方提供的一套框架,用来解决与对象声明周期管理、对象关系管理和持久化等方面相关的问题。
大多数情况下,我们引用CoreData作为持久化数据的解决方案,并利用它作为持久化数据映射为内存对象。提供的是对象-关系映射功能,也就是说,CoreData可以将Objective-C对象转换成数据,保存到SQL中,然后将保存后的数据还原成OC对象。
CoreData的特征:
通过CoreData管理应用程序的数据模型,可以极大程度减少需要编写的代码数量。
将对象数据存储在SQLite数据库已获得性能优化。
提供NSFetchResultsController类用于管理表视图的数据,即将Core Data的持久化存储在表视图中,并对这些数据进行管理:增删查改。
管理undo/redo操纵;
检查托管对象的属性值是否正确。
Core Data的6成员对象
NSManageObject:被管理的数据记录Managed Object Model是描述应用程序的数据模型,这个模型包含实体(Entity)、特性(Property)、读取请求(Fetch Request)等。
NSManageObjectContext:管理对象上下文,持久性存储模型对象,参与数据对象进行各种操作的全过程,并监测数据对象的变化,以提供对undo/redo的支持及更新绑定到数据的UI。
NSPersistentStoreCoordinator:连接数据库的Persistent Store Coordinator相当于数据文件管理器,处理底层的对数据文件的读取和写入,一般我们与这个没有交集。
NSManagedObjectModel:被管理的数据模型、数据结构。
NSFetchRequest:数据请求;
NSEntityDescription:表格实体结构,还需知道.xcdatamodel文件编译后为.momd或者.mom文件。
Core Data的功能
对于KVC和KVO完整且自动化的支持,除了为属性整合KVO和KVC访问方法外,还整合了适当的集合访问方法来处理多值关系;
自动验证属性(property)值;
支持跟踪修改和撤销操作;
关系维护,Core Data管理数据的关系传播,包括维护对象间的一致性;
在内存上和界面上分组、过滤、组织数据;
自动支持对象存储在外部数据仓库的功能;
创建复杂请求:无需动手写SQL语句,在获取请求(fetch request)中关联NSPredicate。NSPreadicate支持基本功能、相关子查询和其他高级的SQL特性。它支持正确的Unicode编码、区域感知查询、排序和正则表达式;
延迟操作:Core Data使用懒加载(lazy loading)方式减少内存负载,还支持部分实体化延迟加载和复制对象的数据共享机制;
合并策略:Core Data内置版本跟踪和乐观锁(optimistic locking)来支持多用户写入冲突的解决,其中,乐观锁就是对数据冲突进行检测,若冲突就返回冲突的信息;
数据迁移:Core Data的Schema Migration工具可以简化应对数据库结构变化的任务,在某些情况允许你执行高效率的数据库原地迁移工作;
可选择针对程序Controller层的集成,来支持UI的显示同步Core Data在IPhone OS之上,提供NSFetchedResultsController对象来做相关工作,在Mac OS X上我们用Cocoa提供的绑定(Binding)机制来完成的。