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.
     如果對圖片的清晰度要求不高,還可以通過設(shè)置 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ìn)一步降低圖片數(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();
    //設(shè)置一個圖片的存儲路徑
    NSString *imagePath = [path_document stringByAppendingString:@"/Documents/pic.png"];
    //把圖片直接保存到指定的路徑(同時應(yīng)該把圖片的路徑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ù)地址進(jìn)行操作。
好處:可以壓縮存放。
//歸檔操作
 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)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,703評論 2 380

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

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