iOS数据存储的几种方式【plist、序列化/反序列化、sqlite3、FMDB】

  • 数据存储

数据存储本质就是运行时的对象保存在文件、数据库中。数据存储可以分为两步:首先是将对象转换成二进制数据,这一步也叫序列化;相反,将二进制数据转换成对象则称为反序列化;然后是考虑二进制数据如何保存和读取。

  • 沙盒

iOS系统为每个App分配了独立的数据目录,App只能对自己的目录进行操作,这个目录所在被称为沙盒目录。
一个应用的沙盒包括下面三个部分:应用目录、沙盒目录、iCloud目录。
在这里插入图片描述

  • Documents

用于保存App的数据,包括App运行时需要的各类文件以及用户的数据等。Documents文件夹可以在连接iTunes时选择备份,通常Documents目录用来存放可以对外的文件。

  • Library

用来保存不对外的数据

  • Library/Caches 用来保存不对外的数据,存放程序运行时的缓存文件。比如通过网络请求下载的图片放到Caches中,再用到这个图片时不用再请求,直接加载。不可被iTunes备份。空间不足时可能会被iOS系统删除。
  • Library/Preferences 通常用于保存用户的设置等信息,比如我们常用的NSUserDefaults类就会以plist的方式保存在该目录中,可被iTunes备份。
  • tmp

目录用来保存不重要的临时文件,在系统重启后会被清空。不会被iTunes备份。

- (void)sandbox:(NSString *)file writeData:(NSArray *)arr {
   
/**
 数据存储到沙盒
 */
       //初始化一个数据
       //NSArray *array = @[@"data", @"storage"];
       //2、获取沙盒根目录
       NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];//数组里的第一个,不止一个
       //3、拼接文件名
       NSString *filePath = [path stringByAppendingPathComponent:file];
       //4、写入
       [arr writeToFile:filePath atomically:YES];//是否原子性,YES表示写入成功之后再生成文件,NO表示不管写入成功与否都生成文件。
}

- (NSArray *)sandboxReadFrom:(NSString *)file {
   
    /**
     从沙盒中取数据
     */
    //获取文件路径
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];//数组里的第一个,不止一个
    NSString *filePath = [path stringByAppendingPathComponent:file];
    NSArray *arr = [NSArray arrayWithContentsOfFile:filePath];
    NSLog(@"%@-----%@", filePath, arr);
    return arr;
}
  • NSFileManager

系统提供了NSFileManager类给开发去读取沙盒目录中的文件。
NSFileManager是单例,通过defaultManager方法可以获取:

NSFileManager *fileManager = [NSFileManager defaultManager];

拿到fileManager就可以判断文件是否存在,并且返回是文件还是文件夹:

[fileManager fileExistsAtPath:filepath1 isDirectory:&isDirectory];

遍历文件夹:

[fileManager contentsOfDirectoryAtPath:filePath error:&error];

复制或者移动文件:

[fileManager copyItemAtPath:sourceFilePath toPath:targetFilePath error:nil];
[fileManager moveItemAtPath:sourceFilePath toPath:targetFilePath error:nil];

更详细的API可以自行查看NSFileManager.h文件。

  • NSBundle

在用NSFileManager去读取文件的时候需要提供文件路径,但是有时候我们并不知道资源被放置在哪个目录,此时可以用到NSBundle。
在Xcode编译运行的时候,会把Xcode内的图片、xib、音频等都拷贝到.app文件中。
NSBundle就是系统提供,用来读取这些资源的类。

NSBundle * mainBundle = [NSBundle mainBundle]

这样我们就拿到我们的mainBundle,通过mainBundle我们可以查找对应的资源:

NSString *path =[mainBundle pathForImageResource:@"some_pic_name"]; // 查找图片地址

也可以通过mainBundle直接加载xib:

[[NSBundle mainBundle] loadNibNamed:@"SSProgressView" owner:self options:nil];

通过CocoaPods安装的Pod库,要如何读取其资源

NSString *path = [[NSBundle mainBundle] pathForResource:@"SSTestPod" ofType:@"bundle"];
NSBundle *podBundle = [NSBundle bundleWithPath:path];
  • NSUserDefaults

[NSUserDefaults standardUserDefaults] 是一个单例,通常用来存储用户的配置信息。本质其实就是一个字典类型的plist文件,不用关心路径,自动保存到Library下的Prefrences。

- (void)userDefaultWrite {
   
    /**
        它的本质其实就是一个字典类型的plist文件,不用关心路径,自动保存到Library下的Prefrences,单例
        */
       [[NSUserDefaults standardUserDefaults] setObject:@"objcet" forKey:@"key"];
       //[[NSUserDefaults standardUserDefaults] synchronize];//立即存储,iOS7之后不需要
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值