iOS开发之数据存储以及删除

iOS本地数据保存有多种方式,归纳如下:

保存到KeyChain(钥匙串) 存储为文件 存储到数据库
保存到沙盒范围以外的地方,与沙盒无关 包括:归档、plist文件存储,偏好设置;归档或者plist文件存储可以选择保存到沙盒中,而偏好设置系统已经规定只能保存到沙盒的 SQLite,Core Data;

本章不仅是学习多种数据存储方式,也可学习到其他知识点,下面就让我们详细来看:

储存为文件
  1. Write写入方式(这里需要注意多种不同的写入方式,作为其中一个知识点,处理不好很多同学容易出错):只能存储常用的类型。

具体方法为:
第一步:获得文件即将保存的路径,并生成在该路径下的文件:

 NSString *myDocumentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
NSString *zhigangPath = [myDocumentPath stringByAppendingPathComponent:@"zhigang.plist"];
 NSArray  *array =@[@"study",@"love",@"zhigang"];

第二步:往文件中写入/读取:
方法一:

[array writeToFile:zhigangPath atomically:YES]写入;
NSArray * data = [NSArray arrayWithContentsOfFile:zhigangPath]读取;

方法二:

    NSURL *urlPath = [NSURL fileURLWithPath:zhigangPath];
    [array writeToURL:urlPath atomically:YES];
    NSArray * data = [NSArray arrayWithContentsOfURL:urlPath];

方法三:

   NSString*fileURL =[@"file://" stringByAppendingString:zhigangPath];
   NSURL*anthorUrlPath = [NSURL URLWithString:fileURL];
   [array writeToURL:urlPath atomically:YES];
   NSArray * data = [NSArray arrayWithContentsOfURL:anthorUrlPath];

解释下:文中用了fileURLWithPath以及URLWithString两种不同方法,我们要分清楚URL和路径的不同;URL是包含协议头 + 主机地址 +资源路径,如果访问的资源是本机的,那么主机地址可以省略;而路径是不用包含协议头和主机地址的; 用fileURLWithPath方法包含了"file://"协议头,而使用URLWithString创建的URL,与原有的字符串一模一样;故:

当我们需要根据一个字符串创建URL的时候,如果这个字符串包含协议头,那么使用URLWithString,一般用于网络资源的URL创建;如果访问的是本地资源,而且不包含协议头,使用fileURLWithPath创建URL。

2.NSUserDefaults:是一个单例对象,在整个应用程序的生命周期中都只有一个实例。用来保存应用程序设置和属性、用户保存的数据。存储在沙盒的Library/Preference中,NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。写入和读取都比较简单,如下:
写入:

 NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
 [userDefault setObject:@"123" forKey:@"zhigang"];
 [userDefault synchronize];
  ```
读取:

NSString *str = [userDefault objectForKey:@"zhigang"];

3.NSKeyedArchiver:采用归档的形式来保存数据,可归档自定义对象,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法。前一个方法告诉系统怎么对对象进行编码,而后一个方法则是告诉系统怎么对对象进行解码。*(注意对NSInteger,NSString的不同操作;)*

**  单个对象归档:**

@interface Person : NSObject <NSCoding>//遵守NSCoding协议
@property (nonatomic,strong) NSString *name;
@property (nonatomic,assign) NSInteger age;
@end

  • (void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:_name forKey:@"name"];
    [aCoder encodeInteger:_age forKey:@"age"];
    }
  • (nullable instancetype)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super init]) {
    _name = [aDecoder decodeObjectForKey:@"name"];
    _age = [aDecoder decodeIntegerForKey:@"age"];
    }
    return self;
    }]
    归档操作:
    只需要NSCoder子类NSKeyedArchiver的方法archiveRootObject:toFile: 即可
    [NSKeyedArchiver archiveRootObject:person toFile:path];]

解档操作:
同样调用NSCoder子类NSKeyedArchiver的方法unarchiveRootObject:toFile: 即可
[NSKeyedUnarchiver unarchiveObjectWithFile:path];

**  多个对象归档:**
对多个对象进行归档,需使用NSData来进行归档对象
NSData可以为一些数据提供临时存储空间,以便随后写入文件,或者存放从磁盘读取的文件内容。可以使用[NSMutableDatadata]创建可变数据空间;

![多对象归档](http://upload-images.jianshu.io/upload_images/2851325-4a39cca7c5875d35.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
[archiver encodeObject:person forKey:@"person"];
[archiver encodeObject:bir forKey:@"bir"];
// 存档完毕(一定要调用这个方法)
[archiver finishEncoding];
[data writeToFile:path atomically:YES];

NSData *undata = [NSData dataWithContentsOfFile:path];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];
[unarchiver decodeObjectForKey:@"person"];
[unarchiver decodeObjectForKey:@"bir"];
// 恢复完毕
[unarchiver finishDecoding];

通过代码基本上发现其实存档和解压是非常简单的一个事情,不过事实这种方式缺点还是很明显的,以这种方式保存数据只能一次性归档保存以及一次性解压。数据较少的时候如果使用感觉比较方便,数据量过多的时候如果想修改其中的某一条,解压整个数据然后归档整个数据还是比较耗时的。

  #####存储到数据库
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容