1. 程式人生 > >ios 檔案儲存

ios 檔案儲存

一,沙盒

iOS 中的沙盒機制(SandBox)是一種安全體系。
每個 iOS 應用程式都有一個單獨的檔案系統(儲存空間),而且只能在對應的檔案系統中進行操作,此區域被稱為沙盒。所有的非程式碼檔案都要儲存在此,例如屬性檔案 plist、文字檔案、影象、圖示、媒體資源等。
Application:存放程式原始檔,上架前經過數字簽名,上架後不可修改,由於應用程式必須經過簽名,所以不能在執行時對這個目錄中的內容進行修改,否則會導致應用程式無法啟動。
每個應用沙盒含有3個資料夾:Documents, Library 和 tmp
如圖
1,Documents:常用目錄,iCloud備份目錄,存放資料,這裡不能存快取檔案,否則上架不被通過,儲存應用程式的重要資料檔案和使用者資料檔案等。iTunes 同步時會備份該目錄
2,Library:


&Caches:儲存應用程式使用時產生的支援檔案和快取檔案,還有日誌檔案最好也放在這個目錄。iTunes 同步時不會備份該目錄。比如下載的音樂,視訊,SDWebImage快取等
&Preference:設定目錄,iCloud會備份設定資訊
3,tmp:存放臨時檔案,不會被備份,而且這個檔案下的資料有可能隨時被清除的可能,按照官方說法每三天清理一次快取資料.
對於上述描述可以這樣舉例理解,一個記事本應用,使用者寫的東西需要儲存起來,這些東西是使用者自行生成的,則需要放在 Documents 目錄裡。一個新聞應用,如果需要從伺服器下載東西展示給使用者看,下載的東西就放在 Library/Caches 目錄裡。蘋果稽核對這個要求很嚴格,主要原因是 iCloud 的同步問題。
(1).獲取沙盒檔案對應的儲存路徑

//沙盒的根路徑
    NSString *rootPath = NSHomeDirectory();
    //獲取Documents目錄
    //[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    //獲取Library路徑
//[NSHomeDirectory() stringByAppendingPathComponent:@"Library"]; NSArray *libPaths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); NSString *libraryDirectory = [libPaths objectAtIndex:0]; //獲取Library路徑下的catch 路徑 NSArray *cacPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSString *cachePath = [cacPath objectAtIndex:0]; //[NSHomeDirectory() stringByAppendingPathComponent:@"tmp"]; NSString *tmp = NSTemporaryDirectory(); //拼接路徑 NSString *tempFilePath = [tmp stringByAppendingPathComponent:@".File"]; }

(2).使用NSFileManager操作檔案

NSString *mypath  = @"你要操作的檔案路徑";
    //拼接路徑
    NSString *doctorPath = [mypath stringByAppendingPathComponent:@"test"];
    //建立檔案管理器物件
    NSFileManager *manager = [NSFileManager defaultManager];
    //建立資料夾
    NSError *error = nil;
   BOOL iscreateSuccess = [manager createDirectoryAtPath:doctorPath withIntermediateDirectories:YES attributes:nil error:&error];

    //建立檔案
    NSString *filePath = [doctorPath stringByAppendingPathComponent:@"test.txt"];
    NSData *filecontent = [@"hello world" dataUsingEncoding:NSUTF8StringEncoding];
    BOOL iscreateFileOk = [manager createFileAtPath:filePath contents:filecontent attributes:nil];

    //寫入資料到檔案
   BOOL isWriteOk = [@"mydata for me" writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];

    //讀取資料
   //1 NSData *data = [NSData dataWithContentsOfFile:filePath];
  NString datacontent =  [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];

    //刪除檔案
  BOOL isDeleteOk = [manager removeItemAtPath:filePath error:nil];

二,使用 plist儲存

特點:(1)只能儲存OC常用資料型別(NSString、NSDictionary、NSArray、NSData、NSNumber等型別)而不能直接儲存自定義模型物件
(2).如果想儲存自定義模型物件 -> 只能將自定義模型物件轉換為字典儲存;
(3).使用前提條件:一個物件必須實現了writeToFile方法,因為我們是通過呼叫物件的writeToFile方法將物件寫入到一個plist檔案中的
(4). plist只能識別字典,陣列

獲取檔案路徑,同上沙盒路徑

//檔案儲存的位置(同上)
 +(NSString*)getFilePath{
    NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
    //拼接要儲存的路徑
    NSString *filePath = [path stringByAppendingPathComponent:FILEPATH];
    return filePath ;
}

寫入要儲存的資料

+(void)writeToFile:(id)data{
    if ([data isKindOfClass:[NSDictionary class]]) {
        NSDictionary *dicdata = (NSDictionary *)data ;
        [dicdata writeToFile:[MyPlist getFilePath] atomically:YES];
    }else if([data isKindOfClass:[NSArray class]]){
        NSArray *arrdata = (NSArray*)data ;
        [arrdata writeToFile:[MyPlist getFilePath] atomically:YES];
    }else{
        NSLog(@"error");
    }

}

讀取plist檔案資料

+(id)readFromFile{
    Boolean isdictionary = YES ;
    if(isdictionary){
        NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:[MyPlist getFilePath]];
        return dic ;
    }else{
        NSArray *array = [NSArray arrayWithContentsOfFile:[MyPlist getFilePath]];
        return array ;
    }

}

三,歸檔 NSKeyedArchiver

這個有點像java序列化serializable
特點:
(1).可以儲存自定義模型物件
NSKeyedArchiver歸檔相對較plist儲存而言,它可以直接儲存自定義模型物件,而plist檔案需要將模型轉為字典才可以儲存自定義物件模型;
(2).歸檔不能儲存大批量資料(相比較Sqlite而言),儲存資料到檔案是將所有的資料一下子儲存到檔案中,從檔案中讀取資料也是一下子讀取所有的資料;
缺點:
(3).假如你的檔案中有多個物件,然後你想在利用歸檔新增一個物件,你需要先把所有的資料解檔出來,然後再加入你想新增的那個物件,同理,你想刪除一個檔案中的一個物件也是,需要解檔出所有的物件,然後將其刪除。這樣處理效能低下
(4).關於使用:需要歸檔的模型類必須要遵守NSCoding協議,然後模型實現類中必須實現兩個方法:1>encodeWithCoder -> 歸檔;2> initWithCoder: - > 解檔

(5). 使用注意:

如果父類也遵守了NSCoding協議,請注意:

應該在encodeWithCoder:方法中加上一句

[super encodeWithCode:encode]; 
// 確保繼承的例項變數也能被編碼,即也能被歸檔

應該在initWithCoder:方法中加上一句

self = [super initWithCoder:decoder]; 
// 確保繼承的例項變數也能被解碼,即也能被恢復
// 1. 自定義模型類Person

// 1.1 Person.h檔案
#import <Foundation/Foundation.h>

// 只要一個自定義物件想要歸檔,必須要遵守NSCoding協議,並且要實現協議的方法
@interface Person : NSObject<NSCoding>

@property (nonatomic, assign) int age;

@property (nonatomic, strong) NSString *name;

@end

// 1.2 .m實現檔案
#import "Person.h"

#define KName @"name"
#define KAge @"age"

@implementation Person

// 什麼時候呼叫:當一個物件要歸檔的時候就會呼叫這個方法歸檔
// 作用:告訴蘋果當前物件中哪些屬性需要歸檔
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:_name forKey:KName];
    [aCoder encodeInt:_age forKey:KAge];
}

// 什麼時候呼叫:當一個物件要解檔的時候就會呼叫這個方法解檔
// 作用:告訴蘋果當前物件中哪些屬性需要解檔
// initWithCoder什麼時候呼叫:只要解析一個檔案的時候就會呼叫
- (id)initWithCoder:(NSCoder *)aDecoder
{
    #warning  [super initWithCoder]
    if (self = [super init]) {
        // 解檔
        // 注意一定要記得給成員屬性賦值
      _name = [aDecoder decodeObjectForKey:KName];
      _age = [aDecoder decodeIntForKey:KAge];
    }
    return self;
}

@end

// 2. 例項 -基本使用:取 / 存 資料 
// 歸檔
 [NSKeyedArchiver archiveRootObject: self.persons toFile:KFilePath];// 將self.persons模型物件陣列 

 // 解檔       
 _persons = [NSKeyedUnarchiver unarchiveObjectWithFile:KFilePath];

四,sqlite 資料庫使用

sqlite原生資料庫,需要寫sql語句
sqlite資料庫使用

使用Coredata對映型資料庫,這個底層還是sqlite資料庫實現的
coreData初步認識

相關推薦

ios 檔案儲存

一,沙盒 iOS 中的沙盒機制(SandBox)是一種安全體系。 每個 iOS 應用程式都有一個單獨的檔案系統(儲存空間),而且只能在對應的檔案系統中進行操作,此區域被稱為沙盒。所有的非程式碼檔案都要儲存在此,例如屬性檔案 plist、文字檔案、影象、圖示

iOS 5的檔案儲存策略應對

蘋果在iOS 5系統時,對app的檔案儲存提出了新的要求。從它的guildline來看,是推薦開發者儘量把app生成的檔案放在Caches目錄下的。原文如下: Only user-generated data or that cannot otherwise be r

IOS App檔案儲存目錄

      IOS系統為每一個App開闢獨立的儲存空間,也就是我們常說的沙盒(sandbox)。App儲存目錄結構可以分為如下4個:(1)xxx.app (2)Documents (3)Library

unity中的檔案儲存路徑與各平臺(Android,iOS)的關係

主要是這個問題困擾我了一陣子,所以特寫寫。。。 unity中的的各種儲存方法的對應關係(直接上截圖吧) 重點說的是Application.presistentDataPath方法,因為這個問題在Android中困擾我很久, 先說說iOS端,很簡單,就是儲存到iOS的沙

[ios2] iOS 5的檔案儲存策略應對【轉】

蘋果在iOS 5系統時,對app的檔案儲存提出了新的要求。從它的guildline來看,是推薦開發者儘量把app生成的檔案放在Caches目錄下的。原文如下: Only user-generated data or that cannot otherwise be recr

iOS如何儲存使用者資訊之plist檔案/歸檔

在iOS開發過程中註冊登入往往是必不可少的, 那麼如何儲存使用者的這些註冊資訊在本地呢? 示例 這裡我建立了一個名為LoginController的控制器, 有五個NSString屬性, 分

運用python將json檔案儲存成csv檔案

工具:  spyder ,codecs  ,pandas # -*- coding: utf-8 -*- """ Spyder Editor This is a temporary script file. """ #-*-coding:utf-8-*- import j

Atitit 檔案儲存標準化api 總結 目錄 1. 作業系統,進行操作 1 1.1. FileUtils類的應用 1 1.2. 各大api 比較 2 2. Java。Io用apache的commo

Atitit 檔案儲存標準化api 總結   目錄 1. 作業系統,進行操作 1 1.1. FileUtils類的應用 1 1.2. 各大api 比較 2 2. Java。Io用apache的commons-io包下的FileUtils 2 2.1. 建立 2

TensorFlow模型檔案儲存和讀取

一、模型檔案的儲存 在訓練一個TensorFlow模型之後,我們可以將訓練好的模型儲存成檔案,這樣可以方便下一次對新的資料進行預測的時候直接載入訓練好的模型即可獲得結果,下面通過TensorFlow提供的tf.train.Saver函式,將一個模型儲存成檔案,一般習慣性的將TensorFlow的模

區塊鏈教程Fabric1.0原始碼分析Ledger blkstorage block檔案儲存

  區塊鏈教程Fabric1.0原始碼分析Ledger blkstorage block檔案儲存,2018年下半年,區塊鏈行業正逐漸褪去發展之初的浮躁、迴歸理性,表面上看相關人才需求與身價似乎正在回落。但事實上,正是初期泡沫的漸退,讓人們更多的關注點放在了區塊鏈真正的技術之上。 Fabric 1.0原始碼筆

通訊錄(三)(檔案儲存

動態通訊錄 上篇部落格介紹了動態通訊錄,本篇繼續進一步將動態通訊錄儲存在檔案裡 載入資訊 void LoadContact(pContact pc) { FILE *pf = fopen("contact.dat.txt", "rb"); PeoInfo

學習筆記-Python基礎19-結構化檔案儲存-json

# JSON- 線上工具 - w3c、菜鳥教程- JSON(JavaScriptObjectNotation)- 輕量級的資料交換格式,基於ECMAScript- json格式是一個鍵值對形式的資料集 - key:字串 - value:字串、數字、列表、json - json使用大括號

學習筆記-Python基礎19-結構化檔案儲存-正則

# 正則表示式(RegularExpression, re) - 是一個電腦科學的概念 - 用於使用單個字串來描述,匹配符合某個規則的字串 - 常常用來檢索、替換某些模式的文字# 正則寫法 - .(點號):表示任意一個字元,除了\n,比如查詢所有的一個字元 - []:匹配中括號中

最全iOS資料儲存方法介紹:FMDB,SQLite3 ,Core Data,Plist,Preference偏好設定,NSKeyedArchiver歸檔,Realm

專案準備運用的Core Data進行本地資料儲存,本來打算只寫一下Core Data的,不過既然說到了資料儲存,乾脆來個資料儲存基礎大總結! 本文將對以下幾個模組進行敘述。 沙盒 Plist Preference偏好設定 NSKeyedArchiver

阿里雲檔案儲存的高效能架構演進之路

摘要: 10月27日下午,2018中國計算機大會上舉辦了主題“資料中心計算”的技術論壇,一起探討解決資料中心所面臨的挑戰。論壇上,阿里雲分散式儲存團隊高階技術專家田磊磊進行了《阿里雲檔案儲存的高效能架構演進之路》的報告。 10月27日下午,2018中國計算機大會上舉辦了主題“資料中心計算”的技術論壇,一起探

thinkphp5上傳的檔案儲存

引用 use think\Request; //接收檔案 $files = Request::instance()->file("file"); //儲存檔案 $info = $files->move(ROOT_PATH . 'public' . DS . 'uploads'

iOS 檔案操作簡介

級別: ★★☆☆☆ 標籤:「iOS 檔案操作」「SandBox」「QiFileManager」 作者: dac_1033 審校: QiShare團隊 在iOS開發過程中,網路出錯沒有返回正確資料時有發生,這時可以讀取本地資料展示給使用者來優化使用者體驗,並且在網路請求正常時及時更新這些本地資料,這

android開發的檔案儲存地址選擇

作為一個開發者,我們經常需要通過快取一些檔案到SD卡中,常見的方式就是,通過: File sdCard = Environment.getExternalStorageDirectory(); 獲取SD卡根目錄,然後自定義檔案/檔名進行檔案儲存.這樣做法的結果就是,當手機安裝了大量的a

Android入門 File檔案儲存

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

儲存基礎知識(三)塊儲存檔案儲存,物件儲存

1、塊儲存 典型裝置:磁碟陣列,硬碟 塊儲存主要是將裸磁碟空間整個對映給主機使用的,就是說例如磁碟陣列裡面有5塊硬碟(為方便說明,假設每個硬碟1G),然後可以通過劃邏輯盤、做Raid、或者LVM(邏輯卷)等種種方式邏輯劃分出N個邏輯的硬碟。(假設劃分完的邏輯盤也是5個,每個也是1G,但是