美文网首页
浅谈iOS本地存储

浅谈iOS本地存储

作者: 奇怪的她的他 | 来源:发表于2017-09-05 13:20 被阅读375次

    iOS本地存储方式有很多种,比如:NSUserDefault,Plist文件存储,CoreData,解档与归档,沙盒存储,CoreData,数据库存储。本文主要介绍项目中常用且又不是很简单的两种:解档与归档(runtime方式)和数据库存储(基于FMDB的二次封装库LKDB)。

    至于其他存储方式请百度,一大堆

    一、解档与归档

    解档与归档主要应用于存储自定义对象,构建模式类似于模型,一个对象多个属性,通过归档存储到本地,解档拿出来用。

    1.首先要解档与归档,我们得有一个专门存储的工具类:新建一个类,继承自NSObject,同时这个类要遵守NSCoding协议

    2.定义对象属性,即存储对象,下面是我的.h文件

    #import <Foundation/Foundation.h>
    
    @interface ShouNewFile : NSObject<NSCoding>
    /** 广告标识符 */
    @property(copy,nonatomic)NSString *AFID;
    /** 手机唯一标识符 */
    @property(copy,nonatomic)NSString *UDID;
    @end
    

    3.在.m文件中用runtime机制实现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];
                    //将值设置到属性上 KVC
                    [self setValue:value forKey:KEY];
                }
                
                //c语言里面需要释放指针!!
                free(ivars);
            }
            return self;
        }
    
    @end
    
    

    4.在需要数据存储的地方存入数据

        //初始化一个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.取出数据

        //归档的路径
        NSString * temp = NSTemporaryDirectory();
        //不同的数据可以不同的命名,存储在同一沙盒目录下。
        NSString * filePath =[temp stringByAppendingPathComponent:@"ShouNew.com"];
        //解档 == OC反序列化
        ShouNewFile *file = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
        NSLog(@"取出成功");
        //拿到数据对象后,可以直接拿到相应的属性值,进行项目需要的操作
    

    6.限制:

     由于归档解档本身不支持可变的集合进行转化为二进制数据存储,所以改方案也不支持可变的集合 NSMutableArray  NSMutableDictionary的类的归档和解档
    

    二、本地数据库存储

    数据库存储适用于数据量比较大的情况,同时也能存储可变集合类型。

    我写了一个小DEMO,GitHub地址:https://github.com/deng690990/SF_DBDemo

    注意运行demo是,界面上看不出什么变化,请看控制台打印

    三、钥匙串存储

    钥匙串存储有个好处是:可以长期存储一些简单的数据,即便APP卸载了,重装,那个数据仍然能在本地获取到,而且可以跨APP使用,但是不能存储大数据。

    Demo下载地址:钥匙串存储唯一标示符

    请将demo里的SFKeychain.h和SFKeychain.m拖入你的项目里,然后参照demo直接调用方法即可。

    相关文章

      网友评论

          本文标题:浅谈iOS本地存储

          本文链接:https://www.haomeiwen.com/subject/ovuujxtx.html