数据存储
应用沙盒
在想要本地存储数据之前,那就要知道一下什么是应用沙盒 ,其实很好理解应用沙盒就是应用的文件夹,与其他文件系统隔离。每一个iOS应用都有自己的应用沙盒,应用必须待在自己的沙盒里,其它应用不能访问该沙盒。
沙盒结构
- Documents :保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录
- Library/Caches : 保存应用运行时生成的需要持久化的数据,iTunes同步设备时不会备份该目录。一般存储体积大、不需要备份的非重要数据
- Library/Preference : 保存应用的所有偏好设置,iOS的Settings(设置)应用会在该目录中查找应用的设置信息。iTunes同步设备时会备份该目录
- tmp : 保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录
数据存储方式
1.NSUserDefaults
NSUserDefaults单例,保存在偏好设置里,它可以用来存储用户的偏好设置,例如:用户名,字体的大小,用户的一些设置等。
2.plist文件
plist的根Type只能是字典(NSDictionary)或者是数组(NSArray)所以归档时我们只能将数组或字典保存到plist文件中,但是NSString也能通过归档保存到plist文件中同时它也可以通过stringWithContentsOfFile解档,它保存到plist中时Type是空的,Value是有值的!
只有遵守了NSCoding协议的类才可以用NSKeyedArchiver归档和NSKeyedUnarchiver解档,如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接用NSKeyedArchiver归档和NSKeyedUnarchiver解档~
coreData和KVC技术的结合
- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues;
如果数据库储存的类型和提供的数据类型不一致,必须重写此方法
4.FMDB
iOS中使用C语言函数对原生SQLite数据库进行增删改查操作,复杂麻烦,于是,就出现了一系列将SQLite API封装的库,如FMDB
FMDB是针对libsqlite3框架进行封装的三方,它以OC的方式封装了SQLite的C语言的API,使用步骤与SQLite相似
FMDB是针对libsqlite3框架进行封装的三方,它以OC的方式封装了SQLite的C语言的API,使用步骤与SQLite相似
FMDB的优点是:
(1) 使用时面向对象,避免了复杂的C语言代码
(2) 对比苹果自带的Core Data框架,更加轻量级和灵活
(3) 提供多线程安全处理数据库操作方法,保证多线程安全跟数据准确性
FMDB缺点:
(1) 因为是OC语言开发,只能在iOS平台上使用,所以实现跨平台操作时存在限制性
(1) 使用时面向对象,避免了复杂的C语言代码
(2) 对比苹果自带的Core Data框架,更加轻量级和灵活
(3) 提供多线程安全处理数据库操作方法,保证多线程安全跟数据准确性
FMDB缺点:
(1) 因为是OC语言开发,只能在iOS平台上使用,所以实现跨平台操作时存在限制性
5.coreData
1.什么是coreData
- iOS开发中实现数据持久化存储的⼀一种重要⼿段。
- CoreData提供了对象-关系映射的功能,能将 Objective-c的对象使⽤数据库或者XML等⽅式 存储。
- 如果使⽤用CoreData将数据存到数据库中,不⽤通过sql语句来操作数据
2.如何使用coreData
1)NSManagedObjectModel,
作用:用来加载 coreData数据模型⽂件,所有的数据模型可以 全部加载到此对象中。
2)NSManagedObjectContext,
作用:⽤于操作数据 模型(对象),并监测数据模型(对象)的变化。
3)NSPersistentStoreCoordinator,
作用:数据持久化存储协调器,负责调度上层与底层对数据的操作。
4)NSManagedObject,
作用:具体的数据模型对象
5)NSEntityDescription,
作用:模型描述类,能够 实例化得到具体的数据模型对象
coreData的使用
1.插入数据
1)+ (id)insertNewObjectForEntityForName:(NSString *)entityName inManagedObjectContext:(NSManagedObjectContext *)context;
作用:实例化一个数据模型
- (BOOL)save:(NSError **)error;
作用:保存到本地
2.查询数据
1)NSFetchRequest,
作用:数据查询请求类
2)NSPredicate,
作用:通过谓词设置查询条件的类
3)NSSortDescriptor
作用:按条件排序查询结果
3.更新数据(建立在查询数据之上)
4.删除数据(建立在查询数据之上)
- (void)deleteObject:(NSManagedObject *)object;
1)NSManagedObjectModel,
作用:用来加载 coreData数据模型⽂件,所有的数据模型可以 全部加载到此对象中。
2)NSManagedObjectContext,
作用:⽤于操作数据 模型(对象),并监测数据模型(对象)的变化。
3)NSPersistentStoreCoordinator,
作用:数据持久化存储协调器,负责调度上层与底层对数据的操作。
4)NSManagedObject,
作用:具体的数据模型对象
5)NSEntityDescription,
作用:模型描述类,能够 实例化得到具体的数据模型对象
coreData的使用
1.插入数据
1)+ (id)insertNewObjectForEntityForName:(NSString *)entityName inManagedObjectContext:(NSManagedObjectContext *)context;
作用:实例化一个数据模型
- (BOOL)save:(NSError **)error;
作用:保存到本地
2.查询数据
1)NSFetchRequest,
作用:数据查询请求类
2)NSPredicate,
作用:通过谓词设置查询条件的类
3)NSSortDescriptor
作用:按条件排序查询结果
3.更新数据(建立在查询数据之上)
4.删除数据(建立在查询数据之上)
- (void)deleteObject:(NSManagedObject *)object;
coreData和KVC技术的结合
- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues;
如果数据库储存的类型和提供的数据类型不一致,必须重写此方法