iOS持久化存储

iOS有以下几种数据持久化方式

一.NSUserDafault

    NSUserDefaults *userInfo = [NSUserDefaults standardUserDefaults];
    NSLog(@"%@  %ld  %@",[userInfo objectForKey:@"age"],[userInfo integerForKey:@"tizhong"],[userInfo objectForKey:@"family"]);

    [userInfo setObject:@33 forKey:@"age"];
    [userInfo setInteger:88 forKey:@"tizhong"];
    [userInfo setObject:@[@"dad",@"mom",@"wife"] forKey:@"family"];
    [userInfo synchronize];

输出

2017-03-31 23:25:48.501 CoreData[6987:560191] 33  88  (
    dad,
    mom,
    wife
)

二.plist表

能存进plist表的数据类型
NSArray;
NSMutableArray;
NSDictionary;
NSMutableDictionary;
NSData;
NSMutableData;
NSString;
NSMutableString;
NSNumber;
NSDate;

    NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
    NSString *fileName = [path stringByAppendingPathComponent:@"family.plist"];
    NSArray *array = @[@"dad",@"mom",@"wife",@22,[@[@11,@22,@33]mutableCopy],[NSDate date]];
    [array writeToFile:fileName atomically:YES];

    NSArray *result = [NSArray arrayWithContentsOfFile:fileName];
    NSLog(@"%@", result);

输出

 (
    dad,
    mom,
    wife,
    22,
        (
        11,
        22,
        33
    ),
    "2017-03-31 15:39:26 +0000"
)

三.归档

@class Dog;

@interface Man : NSObject<NSCoding>
@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) NSInteger age;
@property (nonatomic,copy) Dog *dog;

@end
@implementation Man
@synthesize name;
@synthesize age;
@synthesize dog;

- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:name forKey:@"name"];
    [aCoder encodeInteger:age forKey:@"age"];
    [aCoder encodeObject:dog forKey:@"dog"];
}
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder
{
    if(self = [super init])
    {
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.age = [aDecoder decodeIntegerForKey:@"age"];
        self.dog = [aDecoder decodeObjectForKey:@"dog"];
    }
    return self;
}// NS_DESIGNATED_INITIALIZER

@end


参数dog类定义


@interface Dog : NSObject<NSCoding,NSCopying>
@property (nonatomic,copy) NSString *name;

@end
@implementation Dog
@synthesize name;
- (id)copyWithZone:(nullable NSZone *)zone
{
    Dog *samo = [[self class] allocWithZone:nil];
    samo.name = self.name;
    return samo;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:name forKey:@"name"];
}
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder
{
    if(self = [super init])
    {
        self.name = [aDecoder decodeObjectForKey:@"name"];
    }
    return self;
}// NS_DESIGNATED_INITIALIZER

test代码

-(void)testKeyedArchiver
{
    
    NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
    NSString *fileName = [path stringByAppendingPathComponent:@"some.data"];

    Dog *dog = [[Dog alloc] init];
    dog.name = @"heihei";

    Man *m = [[Man alloc] init];
    m.name = @"me";
    m.age = 20;
    m.dog = dog;
    [NSKeyedArchiver archiveRootObject:m toFile:fileName];
    
    Man *me = [NSKeyedUnarchiver unarchiveObjectWithFile:fileName];
    
    
}

读取的归档

四.SQLite3

http://www.jianshu.com/writer#/notebooks/10081699/notes/10839261

五.CoreData

http://www.jianshu.com/p/1cd286a7d32f

六.KeyChain

manage

@interface QBZKeyChainManage : NSObject
//根据service创建用于操作keychain的dic
+ (NSMutableDictionary *)keyChainQueryDictionaryWithService:(NSString *)service;
//添加数据
+ (BOOL)addData:(id)data forService:(NSString *)service;
//查找数据
+ (id)queryDataWithService:(NSString *)service;
//更新数据
+ (BOOL)updateData:(id)data forService:(NSString *)service;
//删除数据
+ (BOOL)deletaDataWithService:(NSString *)service;
@implementation QBZKeyChainManage
//根据service创建用于操作keychain的dic
+ (NSMutableDictionary *)keyChainQueryDictionaryWithService:(NSString *)service
{
    NSMutableDictionary *keyChainQueryDictionary = [@{} mutableCopy];
    [keyChainQueryDictionary setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];
    [keyChainQueryDictionary setObject:service forKey:(id)kSecAttrService];
    [keyChainQueryDictionary setObject:service forKey:(id)kSecAttrAccount];
    return keyChainQueryDictionary;
}
//添加数据
+ (BOOL)addData:(id)data forService:(NSString *)service
{
    NSMutableDictionary *keyChainQueryDictionary = [QBZKeyChainManage keyChainQueryDictionaryWithService:service];
    SecItemDelete((CFDictionaryRef)keyChainQueryDictionary);
    [keyChainQueryDictionary setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(id)kSecValueData];
    OSStatus status = SecItemAdd((CFDictionaryRef)keyChainQueryDictionary, NULL);
    if(status == noErr)
    {
        return YES;
    }
    return NO;
}
//查找数据
+ (id)queryDataWithService:(NSString *)service
{
    id result;
    NSMutableDictionary *keyChainQuery = [self keyChainQueryDictionaryWithService:service];
    [keyChainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];
    [keyChainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
    CFDataRef keyData = NULL;
    if (SecItemCopyMatching((CFDictionaryRef)keyChainQuery, (CFTypeRef *)&keyData) == noErr) {
        @try {
            result = [NSKeyedUnarchiver  unarchiveObjectWithData:(__bridge NSData *)keyData];
        }
        @catch (NSException *exception) {
            NSLog(@"不存在数据");
        }
        @finally {
            
        }
    }
    if (keyData) {
        CFRelease(keyData);
    }
    return result;
}
//更新数据
+ (BOOL)updateData:(id)data forService:(NSString *)service
{
    NSMutableDictionary *searchDictionary = [self keyChainQueryDictionaryWithService:service];
    
    if (!searchDictionary) {
        return NO;
    }
    
    NSMutableDictionary *updateDictionary = [[NSMutableDictionary alloc] init];
    [updateDictionary setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(id)kSecValueData];
    OSStatus status = SecItemUpdate((CFDictionaryRef)searchDictionary,
                                    (CFDictionaryRef)updateDictionary);
    if (status == errSecSuccess) {
        return YES;
    }
    return NO;
}
//删除数据
+ (BOOL)deletaDataWithService:(NSString *)service
{
    NSMutableDictionary *keyChainDictionary = [self keyChainQueryDictionaryWithService:service];
    OSStatus status = SecItemDelete((CFDictionaryRef)keyChainDictionary);
    if (status == noErr) {
        return YES;
    }
    return NO;
}

@end

test

-(IBAction)add:(id)sender
{
    NSMutableDictionary *dic = [QBZKeyChainManage queryDataWithService:@"testData"];
    if(dic)
    {
        self.label.text = [dic objectForKey:@"title"];
    }else{
        NSMutableDictionary *dic = [@{} mutableCopy];
        [dic setObject:@"测试" forKey:@"title"];
        [QBZKeyChainManage addData:dic forService:@"testData"];
    }
}

两个app之间共享数据

Keychain设置

参考http://www.jianshu.com/p/bf6b42470bba

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

推荐阅读更多精彩内容

  • 概要 iOS常用的持久化存储方案一般有:NSUserDefault、Keychain,File,数据库等几种方案。...
    NapoleonY阅读 1,414评论 0 6
  • plist 创建plist文件(xml) 在Xcode里面,我们创建一个Cocoa项目(PlistTest)。之后...
    kingandyoga阅读 2,244评论 0 0
  • 一、为什么要用归档存储数据 目前在做的项目中,有一个这样的存储需求,需要把用户绑定的钥匙、支持的社区做持久化存储,...
    coderyin阅读 797评论 3 1
  • 简述 简单来说,iOS持久化存储技术就是一些可以把数据存储在硬盘中的方法,让我们的程序在推出或者执行过程中可以访问...
    kingandyoga阅读 404评论 1 1
  • 文丨pinkpink-summer 随着产妇声嘶力竭的叫喊,尽管医生护士再次告诫不能叫不能喊,会浪费力气以至于没法...
    pinkpinksummer阅读 263评论 0 0