iOS數(shù)據(jù)持久化

1埋虹、保存到本地Plist文件

- (IBAction)plistSave:(UIButton *)sender {

   //獲取沙盒路徑
    NSString *sandBoxPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;

    //新建路徑存儲plist文件
    NSString *plistPath = [sandBoxPath stringByAppendingString:@"/StudentInfo.plist"];

    //申明根數(shù)組
    NSMutableArray *rootArray = nil;

    //判斷沙盒路徑是否存在,根據(jù)沙盒路徑初始化數(shù)組届搁,不存在初始化數(shù)組
    if ([[NSFileManager defaultManager] fileExistsAtPath:plistPath]) {
        //根據(jù)沙盒路徑初始化數(shù)組
        rootArray = [NSMutableArray arrayWithContentsOfFile:plistPath];
    }else{
        rootArray = [NSMutableArray array];
    }
    //打包數(shù)據(jù)信息
    if (self.name.text.length == 0 || self.age.text.length == 0 || self.grade.text.length == 0) {
        NSLog(@"信息不完整,存儲失敗");
    }else{
       NSDictionary *dic = @{@"name":self.name.text,@"age":self.age.text,@"grade":self.grade.text};
        [rootArray addObject:dic];
    }

    //存入plist文件
    if ([rootArray writeToFile:plistPath atomically:YES]) {
        NSLog(@"存儲成功");
    }else{
        NSLog(@"存儲失敗");
    }

    NSLog(@"%@",plistPath);

}

2窍育、從plist文件中讀取數(shù)據(jù)

- (IBAction)plistFetch:(UIButton *)sender {
    //獲取沙盒路徑
    NSString *sandBoxPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;

    //新建路徑存儲plist文件
    NSString *plistPath = [sandBoxPath stringByAppendingString:@"/StudentInfo.plist"];

    //申明根數(shù)組
    NSMutableArray *rootArray = nil;

    //判斷沙盒路徑是否存在卡睦,根據(jù)沙盒路徑初始化數(shù)組,不存在初始化數(shù)組
    if ([[NSFileManager defaultManager] fileExistsAtPath:plistPath]) {
        //根據(jù)沙盒路徑初始化數(shù)組
        rootArray = [NSMutableArray arrayWithContentsOfFile:plistPath];
    }else{
        rootArray = [NSMutableArray array];
    }

    //判斷輸入信息是否存在
    for (NSDictionary *dic in rootArray) {
        if ([dic[@"name"] isEqualToString:self.name.text]) {
            NSLog(@"用戶存在");
        }
    }



}

3漱抓、刪除Plist文件

- (IBAction)plistDeleted:(UIButton *)sender {
    //獲取沙盒路徑
    NSString *sandBoxPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;

    //新建路徑存儲plist文件
    NSString *plistPath = [sandBoxPath stringByAppendingString:@"/StudentInfo.plist"];

    //申明根數(shù)組
    NSMutableArray *rootArray = nil;

    //判斷沙盒路徑是否存在表锻,根據(jù)沙盒路徑初始化數(shù)組,不存在初始化數(shù)組
    if ([[NSFileManager defaultManager] fileExistsAtPath:plistPath]) {
        //根據(jù)沙盒路徑初始化數(shù)組
        rootArray = [NSMutableArray arrayWithContentsOfFile:plistPath];
    }else{
        rootArray = [NSMutableArray array];
    }


}

4乞娄、沙盒文件目錄獲取代碼


//Home
//Home目錄
NSString *homeDirectory = NSHomeDirectory();

//Document
//Document目錄
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
NSString *path = [paths objectAtIndex:0];

//Cache
//Cache目錄
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);  
NSString *path = [paths objectAtIndex:0];
       //Libary目錄
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];

5瞬逊、圖片存入plist (需要轉(zhuǎn)換)

    //獲取沙盒路徑显歧,
    NSString *path_sandox = NSHomeDirectory();
    //創(chuàng)建一個存儲plist文件的路徑
    NSString *newPath = [path_sandox stringByAppendingPathComponent:@/Documents/pic.plist];
    NSMutableArray *arr = [[NSMutableArray alloc] init];
    UIImage *image = [UIImage imageNamed:@"1.png"];

    /*
     把圖片轉(zhuǎn)換為Base64的字符串  
     在iphone上有兩種讀取圖片數(shù)據(jù)的簡單方法: UIImageJPEGRepresentation和UIImagePNGRepresentation.

     UIImageJPEGRepresentation函數(shù)需要兩個參數(shù):圖片的引用和壓縮系數(shù).而UIImagePNGRepresentation只需要圖片引用作為參數(shù).通過在實際使用過程中,
     比較發(fā)現(xiàn): UIImagePNGRepresentation(UIImage* image) 要比UIImageJPEGRepresentation(UIImage* image, 1.0) 返回的圖片數(shù)據(jù)量大很多.
     譬如,同樣是讀取攝像頭拍攝的同樣景色的照片, UIImagePNGRepresentation()返回的數(shù)據(jù)量大小為199K ,
     而 UIImageJPEGRepresentation(UIImage* image, 1.0)返回的數(shù)據(jù)量大小只為140KB,比前者少了50多KB.
     如果對圖片的清晰度要求不高,還可以通過設置 UIImageJPEGRepresentation函數(shù)的第二個參數(shù),大幅度降低圖片數(shù)據(jù)量.譬如,剛才拍攝的圖片,
     通過調(diào)用UIImageJPEGRepresentation(UIImage* image, 1.0)讀取數(shù)據(jù)時,返回的數(shù)據(jù)大小為140KB,但更改壓縮系數(shù)后,
     通過調(diào)用UIImageJPEGRepresentation(UIImage* image, 0.5)讀取數(shù)據(jù)時,返回的數(shù)據(jù)大小只有11KB多,大大壓縮了圖片的數(shù)據(jù)量 ,
     而且從視角角度看,圖片的質(zhì)量并沒有明顯的降低.因此,在讀取圖片數(shù)據(jù)內(nèi)容時,建議優(yōu)先使用UIImageJPEGRepresentation,
     并可根據(jù)自己的實際使用場景,設置壓縮系數(shù),進一步降低圖片數(shù)據(jù)量大小.
     */
    NSData *_data = UIImageJPEGRepresentation(image, 1.0f);
    //將圖片的data轉(zhuǎn)化為字符串
    NSString *strimage64 = [_data base64EncodedString];

    [arr addObject:image64];    
     //寫入plist文件    
    if ([arr writeToFile:newPath atomically:YES]) {       
    NSLog(@"寫入成功");    
   };
    //可以到沙河路徑下查看plist文件中的圖片數(shù)據(jù)
    //這樣就存起來的,然后用到的時候再利用存儲的字符串轉(zhuǎn)化為圖片
    //NSData *_decodedImageData = [[NSData alloc] initWithBase64Encoding:image64];  這是iOS7之前的一個方法

    NSData *_decodedImageData = [[NSData alloc]initWithBase64EncodedString:strimage64 options:NSDataBase64DecodingIgnoreUnknownCharacters];
    UIImage *_decodedImage = [UIImage imageWithData:_decodedImageData];

    //可以打印下圖片是否存在
    NSLog(@"===Decoded image size: %@", NSStringFromCGSize(_decodedImage.size));

6确镊、把圖片直接保存到沙盒中士骤,然后再把路徑存儲起來,等到用圖片的時候先獲取圖片的路徑骚腥,再通過路徑拿到圖片敦间。

(1)
    //拿到圖片
    UIImage *image2 = [UIImage imageNamed:@"1.png"];
    NSString *path_document = NSHomeDirectory();
    //設置一個圖片的存儲路徑
    NSString *imagePath = [path_document stringByAppendingString:@"/Documents/pic.png"];
    //把圖片直接保存到指定的路徑(同時應該把圖片的路徑imagePath存起來瓶逃,下次就可以直接用來仁)
    [UIImagePNGRepresentation(image2) writeToFile:imagePath atomically:YES];

(2)通過地址取圖片
    UIImage *getimage2 = [UIImage imageWithContentsOfFile:imagePath];
    NSLog(@"image2 is size %@",NSStringFromCGSize(getimage2.size));

7、歸檔(序列化)

(1)歸檔的類遵守NSCoding協(xié)議厢绝。
(2)實現(xiàn)encodeWithCoder 和initWithCoder方法契沫。
(3)根據(jù)地址進行操作。
好處:可以壓縮存放昔汉。
//歸檔操作
 BOOL archiver = [NSKeyedArchiver archiveRootObject:per toFile:self.savePath];

8懈万、CoreData

(1)配置上下文NSManagedObjectContext:在內(nèi)存中開辟一個空間,用于專門處理某件事情靶病,結(jié)束之后去內(nèi)存中讀取上下文会通。鏈接不同功能模塊,保證模塊獨立性娄周。(NSPrivateQueueConcurrencyType私有隊列涕侈,開辟新的線程池,不阻塞主線程煤辨。NSMainQueueConcurrencyType主隊列)裳涛。
NSManagedObjectContext * context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
        //配置存儲調(diào)度器
        //a.從程序中加載模型
        NSManagedObjectModel * model = [NSManagedObjectModel mergedModelFromBundles:nil];
        NSPersistentStoreCoordinator * store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
        //b.配置存儲調(diào)度器存儲路徑
        NSURL *url = [NSURL fileURLWithPath:self.keyPath];
        [store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:nil];
        //將調(diào)度器賦值給上下文
        context.persistentStoreCoordinator = store;
        _context = context;
(2)增刪改查
- (IBAction)action_btn:(UIButton *)sender {

    switch (sender.tag) {
        case 101:
        {
            //插入
            Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.context];
            person.name = self.name.text;
            person.phone = self.phone.text;

            //保存上下文
            [self.context save:nil];

        }
            break;

        case 102:
        {
            //刪除
            NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
            //在上下文中查找
            NSArray *array = [self.context executeFetchRequest:request error:nil];
            //匹配數(shù)據(jù)
            for (Person *per in array) {
                if ([per.name isEqualToString:@"12"]) {
                    [self.context deleteObject:per];
                }
            }
            //數(shù)據(jù)保存
            [self.context save:nil];

        }
            break;

        case 103:
        {
            //修改
            NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
            //在上下文中查找
            NSArray *array = [self.context executeFetchRequest:request error:nil];
            //匹配數(shù)據(jù)
            for (Person *per in array) {
                if ([per.name isEqualToString:@"12"]) {
                    per.name = @"張三";
                }
            }
            //數(shù)據(jù)保存
            [self.context save:nil];

        }
            break;

        case 104:
        {
            //配置查找條件
            NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
            request.fetchLimit = 10;//查詢長度
            request.fetchOffset = 0;//查詢起始點

            //查詢條件
            NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name==%@",@"zhangsan"];
            request.predicate = predicate;

            //在上下文中查找
            NSArray *array = [self.context executeFetchRequest:request error:nil];
            NSLog(@"%@",array);
        }
            break;

        default:
            break;
    }
}


過濾條件    ‘*’表示任意字符
     beginswith 以...開始
     endswith   以...結(jié)束
     contaits   包含...
     like       像...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市众辨,隨后出現(xiàn)的幾起案子端三,更是在濱河造成了極大的恐慌,老刑警劉巖鹃彻,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件郊闯,死亡現(xiàn)場離奇詭異,居然都是意外死亡蛛株,警方通過查閱死者的電腦和手機团赁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泳挥,“玉大人然痊,你說我怎么就攤上這事√敕” “怎么了剧浸?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵锹引,是天一觀的道長。 經(jīng)常有香客問我唆香,道長嫌变,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮画切,結(jié)果婚禮上霜旧,老公的妹妹穿的比我還像新娘。我一直安慰自己倘待,他們只是感情好,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布组贺。 她就那樣靜靜地躺著凸舵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪失尖。 梳的紋絲不亂的頭發(fā)上啊奄,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音掀潮,去河邊找鬼菇夸。 笑死,一個胖子當著我的面吹牛仪吧,可吹牛的內(nèi)容都是我干的庄新。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼邑商,長吁一口氣:“原來是場噩夢啊……” “哼摄咆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起人断,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤吭从,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后恶迈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涩金,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年暇仲,在試婚紗的時候發(fā)現(xiàn)自己被綠了步做。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡奈附,死狀恐怖全度,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情斥滤,我是刑警寧澤将鸵,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布勉盅,位于F島的核電站,受9級特大地震影響顶掉,放射性物質(zhì)發(fā)生泄漏草娜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一痒筒、第九天 我趴在偏房一處隱蔽的房頂上張望宰闰。 院中可真熱鬧,春花似錦簿透、人聲如沸移袍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咐容。三九已至,卻和暖如春蚂维,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背路狮。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工虫啥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奄妨。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓涂籽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親砸抛。 傳聞我的和親對象是個殘疾皇子评雌,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

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

  • 1.簡介 數(shù)據(jù)持久存儲是一種非易失性存儲,在重啟動計算機或設備后也不會丟失數(shù)據(jù)直焙。持久化技術(shù)主要用于MVC模型中的m...
    公子無禮閱讀 1,680評論 0 4
  • iOS開發(fā)-數(shù)據(jù)持久化 原文鏈接 Sindri的小巢 在程序開發(fā)中景东,數(shù)據(jù)層永遠是程序的核心結(jié)構(gòu)之一。我們將現(xiàn)實事物...
    人生路02閱讀 755評論 1 4
  • iOS本地數(shù)據(jù)保存有多種方式,比如NSUserDefaults奔誓、歸檔斤吐、plist文件保存、數(shù)據(jù)庫厨喂、CoreData...
    iOS小飛羊閱讀 302評論 0 0
  • 前言: 在程序開發(fā)中和措,數(shù)據(jù)層永遠是程序的核心結(jié)構(gòu)之一。對這些數(shù)據(jù)的加工處理是代碼中能體現(xiàn)技術(shù)水平的一大模塊蜕煌,比如數(shù)...
    麥穗0615閱讀 1,459評論 3 22
  • iOS數(shù)據(jù)持久化方式 文件 歸檔(NSKeyedArchiver) 屬性列表(NSUserDefaults) 數(shù)據(jù)...
    向陽的向日葵花閱讀 901評論 0 12