淺談iOS本地存儲

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ù)幔嗦。

Demo下載地址:鑰匙串存儲唯一標示符

請將demo里的SFKeychain.h和SFKeychain.m拖入你的項目里酿愧,然后參照demo直接調(diào)用方法即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末邀泉,一起剝皮案震驚了整個濱河市嬉挡,隨后出現(xiàn)的幾起案子钝鸽,更是在濱河造成了極大的恐慌,老刑警劉巖庞钢,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拔恰,死亡現(xiàn)場離奇詭異,居然都是意外死亡基括,警方通過查閱死者的電腦和手機颜懊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來风皿,“玉大人河爹,你說我怎么就攤上這事⊥┛睿” “怎么了咸这?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長魔眨。 經(jīng)常有香客問我炊苫,道長,這世上最難降的妖魔是什么冰沙? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任侨艾,我火速辦了婚禮,結(jié)果婚禮上拓挥,老公的妹妹穿的比我還像新娘唠梨。我一直安慰自己,他們只是感情好侥啤,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布当叭。 她就那樣靜靜地躺著,像睡著了一般盖灸。 火紅的嫁衣襯著肌膚如雪蚁鳖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天赁炎,我揣著相機與錄音醉箕,去河邊找鬼。 笑死徙垫,一個胖子當(dāng)著我的面吹牛讥裤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播姻报,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼己英,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吴旋?” 一聲冷哼從身側(cè)響起损肛,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤厢破,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后治拿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摩泪,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年忍啤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仙辟。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡同波,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出叠国,到底是詐尸還是另有隱情未檩,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布粟焊,位于F島的核電站冤狡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏项棠。R本人自食惡果不足惜悲雳,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望香追。 院中可真熱鬧合瓢,春花似錦、人聲如沸透典。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽峭咒。三九已至税弃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凑队,已是汗流浹背则果。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留漩氨,地道東北人短条。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像才菠,于是被迫代替她去往敵國和親茸时。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容