数据存储方式和存储位置

来源:互联网 发布:淘宝京润珍珠是真的吗 编辑:程序博客网 时间:2024/05/23 16:54

数据本地化,减少不必要的请求,能使app用起来感觉更流畅。好的数据储存结构和存储方式,也能使开发更得心应手。

存储方式一般有NSUserDefaults、NSKeyedArchiver(归档)、write写入方式、SQLite四种。存储位置即iOS的沙盒路径。

  • 沙盒NSHomeDirectory()下含三个文件夹
这里写图片描述
1.Documents
Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时,会备份该目录。
前往方式:
1.NSString * path = [NSHomeDirectory() stringByAppendingPathComponent:@”Documents”];
2.NSString * path =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
2.tmp
tmp:保留应用运行时的临时数据,使用完毕后会被删除。内存告警时,系统会自动清除这块。iTunes同步不会备份该目录。
前往方式:
1.NSString * path = [NSHomeDirectory() stringByAppendingPathComponent:@”tmp”];
2.NSString *path = NSTemporaryDirectory();
3.Library
Library下包含连个文件夹Caches和Preference
Library路径 [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) firstObject];
Caches:保存应用运行时生成的需要持久化的数据,一般存储的体积不大。iTunes同步时,不会备份该目录
Preference:保存应用的所有偏好设置,iTunes同步时,会备份该目录
    数据存储方式

1.NSUserDefaults

多用于存储偏好设置,比如保存用户名,密码,是否自动登录等。UserDefault设置数据时,不是立即写入,而是根据时间截定时地把缓存中的数据写入到本地磁盘,可通过synchronize方法强制写入来做到实时更新。NSUserDefaults本质是个字典,最终写到Library/Preference下的一个.plist文件里。

基本使用如下

NSUserDefaults *UserDefaults = [NSUserDefaultsstandardUserDefaults];// 1、写入[UserDefaults setBool:NO forKey:@"isLogined"];// 强制写入[defaults synchornize];  // 2、读取BOOL isVisble = [UserDefaults boolForKey:@"isLogined"];

2.NSKeyedArchiver(归档)

归档特点如下:
1.可以存储自定义模型对象。NSUserDefaults、plist文件、sqlite都知道存基本的数据类型,无法存储自定义的对象。
2.自定义模型对象必须遵循’NSCoding’协议,
实现两个方法:1>encodeWithCoder -> 归档(序列化);2> initWithCoder: - > 解档(发序列化)
缺点:
归档不能逐条的添加、修改、删除数据。比如说已经有100条数据,想添加一条,需要先把所有的数据解档出来。
使用感想:
归档的缺点,让归档有点鸡肋的感觉。不能逐条操作是比较浪费时间的,不如用sqlite存每个对象的基本数据,要使用时再生成对象。不过对数据量不大的操作,还是可以考虑下,毕竟操作比sqlite还是简单很多。

使用示例

    //1.自定义模型类Person    //1.1 person.h    #import <Foundation/Foundation.h>    // 只要一个自定义对象想要归档,必须要遵守NSCoding协议,并且要实现协议的方法    @interface person :  NSObject<NSCoding>@property (nonatomic, assign) int age;@property (nonatomic, strong) NSString *name;@end    //1.2 person.m    #import "Person.h"    @implementation Person    // 什么时候调用:当一个对象要归档的时候就会调用这个方法归档    // 作用:告诉苹果当前对象中哪些属性需要归档    - (void)encodeWithCoder:(NSCoder *)aCoder{[aCoder encodeObject:_name forKey:@"name"];[aCoder encodeInt:_age forKey:@"age"];}//归档和解档所对应的key值要保存一致// 什么时候调用:当一个对象要解档的时候就会调用这个方法解档// 作用:告诉苹果当前对象中哪些属性需要解档// initWithCoder什么时候调用:只要解析一个文件的时候就会调用- (id)initWithCoder:(NSCoder *)aDecoder{if (self = [super init]) {    // 解档    // 注意一定要记得给成员属性赋值    _name = [aDecoder decodeObjectForKey:@"name"];    _age = [aDecoder decodeIntForKey:@"age"];}return self;}//使用如下person * p1 = [[person alloc] init];p1.age = 10;p1.name = @"test";person * p2 = [[person alloc] init];p2.age = 11;p2.name = @"p2name";NSMutableArray * arr = [[NSMutableArray alloc] initWithObjects:p1,p2, nil];NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];/*    路径如果是文件夹路径,归档会出错。 必须是文件路径,文件的后缀名是什么都可以,如果最终的存储 */path = [path stringByAppendingPathComponent:@"person.archiver"];if ([NSKeyedArchiver archiveRootObject:arr toFile:path]) { //归档    NSLog(@"归档成功");}else{    NSLog(@"归档失败");}//解档  这里是解出所有的数据,而无法做到逐条的解档 NSArray * pArr = [NSKeyedUnarchiver unarchiveObjectWithFile:path];NSLog(@"pArr = %@",pArr);

3.write写入

[data writeToFile:FileName atomically:YES] 将数据data写到指定路径FileName下,data的类型可以是数组,字典,nsdata,字符串。函数返回BOOL数据,表示是否写成功。

同样的FileName必须是文件路径,而不是文件夹路径。

write方法简单粗暴,本身没什么可说的。稍稍说下可能与它相关的NSFileManager(如同名字:文件管理)
常用的方法:
1.单例 NSFileManager * filemgr = [NSFileManager defaultManager];
2.判断文件夹是否存在 - (BOOL)fileExistsAtPath:(NSString *)path;
3.创建文件夹- (BOOL)createDirectoryAtPath:(NSString )path withIntermediateDirectories:(BOOL)createIntermediates attributes:(nullable NSDictionary< NSString , id> )attributes error:(NSError *)error
等等一些方法,大家可以进入它的.h文件,也可以搜下别的博客看下

4.SQLite

SQLite(http://www.sqlite.org/docs.html)是一个轻量级的关系数据库。 SQLite最初的设计目标是用于嵌入式系统,它占用资源非常少,在嵌入式设备中,只需要几百K的内存就够了,目前应用于Android、iOS、Window Phone等智能手机。iOS使用时SQLite,只需要加入libsqlite3.0.tbd依赖以及引入sqlite3.h头文件即可

SQLite和CoreData
CoreData.framework是iOS中提供的对原始SQLite数据库API访问的封装,通过这个framework来管理数据缓存和持久数据要比使用SQL语句操作SQLite数据库简单和方便许多(有比较好的第三方库对SQLite封装,使用起来也比较方便,比如FMDB)

推荐使用FMDB
关于FMDB,大家可以去FMDB推荐

使用SQLite必定要用SQL语句,SQL基础可以参考W3School

5.其他的

.plist文件,iOS中经常会看到这个.plist文件 如info.plist。
.plist文件可以理解成属性列表文件,主要用来存储串行化后的对象文件,最终以XML形式存储。(简单点,就是一个文件,跟.txt文件一样,里面放一些要存储的内容),可以通过New File->Resource->Property List创建。

NSCache
缓存类,博主使用的也比较少,给个链接NSCache,这里提到它,只是让大家多多关注更多的知识,学无止境。

0 0
原创粉丝点击