iOS本地存儲方式有很多種,比如:NSUserDefault,Plist文件存儲,CoreData,解檔與歸檔僵腺,沙盒存儲,CoreData壶栋,數(shù)據(jù)庫存儲辰如。本文主要介紹項目中常用且又不是很簡單的兩種:解檔與歸檔(runtime方式)和數(shù)據(jù)庫存儲(基于FMDB的二次封裝庫LKDB)。
至于其他存儲方式請百度贵试,一大堆
一琉兜、解檔與歸檔
解檔與歸檔主要應(yīng)用于存儲自定義對象,構(gòu)建模式類似于模型毙玻,一個對象多個屬性豌蟋,通過歸檔存儲到本地,解檔拿出來用桑滩。
1.首先要解檔與歸檔梧疲,我們得有一個專門存儲的工具類:新建一個類,繼承自NSObject,同時這個類要遵守NSCoding協(xié)議
2.定義對象屬性运准,即存儲對象幌氮,下面是我的.h文件
#import <Foundation/Foundation.h>
@interface ShouNewFile : NSObject<NSCoding>
/** 廣告標識符 */
@property(copy,nonatomic)NSString *AFID;
/** 手機唯一標識符 */
@property(copy,nonatomic)NSString *UDID;
@end
3.在.m文件中用runtime機制實現(xiàn)NScoding操作
#import "ShouNewFile.h"
#import <objc/message.h>
@implementation ShouNewFile
- (void)encodeWithCoder:(NSCoder *)coder
{
unsigned int count = 0;
Ivar * ivars = class_copyIvarList([ShouNewFile class], &count);
for (int i = 0; i < count; i++) {
//拿出屬性的名稱
Ivar ivar = ivars[i];
const char * name = ivar_getName(ivar);
NSString * KEY = [NSString stringWithUTF8String:name];
//取出屬性的值
id value = [self valueForKey:KEY];
//歸檔
[coder encodeObject:value forKey:KEY];
}
//c語言里面需要釋放指針!!
free(ivars);
}
//解檔!!
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super init];
if (self) {
unsigned int count = 0;
Ivar * ivars = class_copyIvarList([ShouNewFile class], &count);
for (int i = 0; i < count; i++) {
//拿出屬性的名稱
Ivar ivar = ivars[i];
const char * name = ivar_getName(ivar);
NSString * KEY = [NSString stringWithUTF8String:name];
//解檔
id value = [coder decodeObjectForKey:KEY];
//將值設(shè)置到屬性上 KVC
[self setValue:value forKey:KEY];
}
//c語言里面需要釋放指針!!
free(ivars);
}
return self;
}
@end
4.在需要數(shù)據(jù)存儲的地方存入數(shù)據(jù)
//初始化一個ShouNewFile對象
ShouNewFile *file = [[ShouNewFile alloc]init];
file.AFID = @"LLLDFKDL<AMDFLLFGL";
file.UDID = @"kjdfksdkkdj";
//歸檔的路徑
NSString * temp = NSTemporaryDirectory();
NSString * filePath =[temp stringByAppendingPathComponent:@"ShouNew.com"];
//歸檔
[NSKeyedArchiver archiveRootObject:file toFile:filePath];
NSLog(@"存入成功");
5.取出數(shù)據(jù)
//歸檔的路徑
NSString * temp = NSTemporaryDirectory();
//不同的數(shù)據(jù)可以不同的命名,存儲在同一沙盒目錄下胁澳。
NSString * filePath =[temp stringByAppendingPathComponent:@"ShouNew.com"];
//解檔 == OC反序列化
ShouNewFile *file = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"取出成功");
//拿到數(shù)據(jù)對象后该互,可以直接拿到相應(yīng)的屬性值,進行項目需要的操作
6.限制:
由于歸檔解檔本身不支持可變的集合進行轉(zhuǎn)化為二進制數(shù)據(jù)存儲韭畸,所以改方案也不支持可變的集合 NSMutableArray NSMutableDictionary的類的歸檔和解檔
二宇智、本地數(shù)據(jù)庫存儲
數(shù)據(jù)庫存儲適用于數(shù)據(jù)量比較大的情況,同時也能存儲可變集合類型胰丁。
我寫了一個小DEMO,GitHub地址:https://github.com/deng690990/SF_DBDemo
注意運行demo是普筹,界面上看不出什么變化,請看控制臺打印
三隘马、鑰匙串存儲
鑰匙串存儲有個好處是:可以長期存儲一些簡單的數(shù)據(jù)太防,即便APP卸載了,重裝酸员,那個數(shù)據(jù)仍然能在本地獲取到蜒车,而且可以跨APP使用,但是不能存儲大數(shù)據(jù)幔嗦。