iOS筆記———資料存放區

來源:互聯網
上載者:User

標籤:

 

應用沙箱:應用檔案系統的根目錄,每個應用都有獨自的沙箱相互;在xcode中可以用NSHomeDirectory()函數,列印當前應用的沙箱根路徑。

應用程式套件組合:包含了所有資源檔和執行檔案;

  * Documents:儲存應用運行時產生的需要持久化的資料,iTunes同步會備份該目錄。

  * tmp:儲存應用運行時產生的臨時資料,使用完畢後再將相應的檔案從該目錄從刪除,應用沒有運行時系統也會自動清楚該目錄,iTunes同步時不會被備份該目錄。

  * Library/Caches:儲存應用運行時產生的需要持久化的資料,iTunes同步時不會備份該目錄,一般儲存比較大的資料、不用備份的資料。

  * Library/Preference:儲存應用的所有喜好設定,iOS的setting(設定)應用會在這在該目錄中尋找應用的設定資訊。iTunes同步時,會備份該目錄。

 

擷取Documents目錄的兩種方式:

  1,NSHomeDirectory()擷取應用的根目錄,然後用NSString類的對象方法stringByAppendingPathComponent:拼接Documents.

//擷取到應用根目錄NSString *home = NSHomeDirectory();NSString *path =[home stringByAppendingPathComponent:@"Documents"];

   2,NSSearchPathForDirectoriesInDomains()函數

//NSUserDomainMask 代表從使用者檔案夾下找//NO 代表不展開路徑下的波浪字元“~”NSArray *arr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,NO);//在iOS中,只有一個目錄跟傳入的參數匹配,所以這個集合裡面只有一個元素NSString *document = [arr objectAtIndex:0];

 

 

擷取tmp路徑:NSString *tmp = NSTemporaryDirectory();

擷取Library/Caches路徑:NSString *caches = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,NO);

擷取Library/Preference:通過NSUserDefaults類擷取資訊。

 

iOS應用常用的資料存放區方式有:

  * XML屬性列表(plist)歸檔;

  * preference(喜好設定);

  * NSKeyedArchiver歸檔(NSCoding);

  * SQLite3

  * Core Data;

 

XML屬性列表

  是一種xml格式的檔案,拓展名為plist.若對象是NSString\NSDictionary\NSArray\NSData\NSNumber等類型,

  都可以調用writeToFile:aomically:方法將對象寫到plist檔案中。 

 

NSMutableDictionary *dict = [NSMutableDictionary dictionary];[dict setObject:@"jack" forKey:@"name"];[dict setObject:@"1223244" forKey:@"phone"];//filePath 可以documens路徑或者沙箱裡其他路徑;[dict writeToFile:filePath atomically:YES];//讀取plist檔案;NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:filePath];

 

Preference(喜好設定):很多iOS應用都支援喜好設定,比如儲存使用者名稱、密碼、字型大小等設定。每個應用都有一個NSUserDefaults執行個體,通過這個執行個體來存取喜好設定。

//儲存喜好設定內容NSUserDefaults *defaluts = [NSUserDefaults standardUserDefaults];[defaults setobject:@"jack" forKey:@"UserName"];[defaults setFloat:190.1f forKey:@"height"];[defaults setBool:YES forKey:@"autoLogin"];//取得喜好設定內容NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];NSString *userName = [defaults stringForKey:@"userName"];float height = [defaults floatForKey:@"height"];BOOL autoLogin = [defaults boolForKey:@"autoLogin"];

 * 注意:NSUserDefaults 設定資料時,不是立即寫入,而是根據時間戳記定時地把緩衝中的資料寫入本地磁碟,所以調用了set方法之後資料可能還沒寫入磁碟應用程式就終止。

  出現以上問題可以調用synchronize方法強制寫入。

[defaults synchronize];

 NSKeyedArchiver歸檔(NSCoding)

  * 如果對象是NSString、NSDictionary、NSData、NSArray、NSNumber等,可以直接用NSKeyedArchiver進行歸檔和恢複。

  * 其他對象需要遵循NSCoding協議。

  * NSCoding協議的兩個方法:

    · encodeWithCode:每次歸檔對象時,都會調用這個方法。一般在這個方法裡面指定如何歸檔對象中的每個執行個體變數,可以用encodeObject:forKey:\encodeInt:forKey:等方法進行歸檔。

    · initWithCoder:每次從檔案中恢複(解碼)時,都會調用這個方法。這個方法指定如何解碼檔案中的資料轉為對象的執行個體變數。可以用使用decodeObject:forKey\decodeInt:forKey:等方法解碼執行個體變數。

//建立Person對象 遵守 NSCoding 協議Person.h @interface Person : NSObject@property(copy,nonatomic) NSString *name;@property(assign,nonatomic) int age;@end Person.m#import "Person.h" @implementation Person  - (void)encodeWithCoder:(NSCoder *)aCoder{        [aCoder encodeObject:self.name forKey:@"name"];    [aCoder encodeInt:self.age forKey:@"age"];} - (id)initWithCoder:(NSCoder *)aDecoder{        if (self = [super init]) {        self.name = [aDecoder decodeObjectForKey:@"name"];        self.age = [aDecoder decodeIntForKey:@"age"];    }    return self;}@end//擷取歸檔路徑檔案filePathPerson *p = [[Peron alloc] init];p.name = @"jack";p.age = 10; NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectiory,NSUserDomainMask,YES) lastObject];NSString *filePath = [doc stringByAppendingPathComponent:@"person.data"];//對象歸檔[NSKeyedArchiver archiveRootObject:p toFile:filePath];//從filePath中讀取對象Person *p1 = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

 ***注意 :如果對象的父類也遵守了NSCoding的協議,

  在實現encodeWithCoder:方法中應該調用 [super encodeWithCoder:aCoder]; 

  實現initWithCoder:方法中 應該調用 self = [super initWithCoder:aCoder];

確保繼續的成員變數能被歸檔和解檔。

NSData

  * 使用archiveRootObject:toFile:方法可以將一個對象直接寫入一個檔案中,但多時候需將多個對象同時寫入到一個檔案中,那麼就用到NSData來歸檔。

  * NSData可以為一些資料提供臨時的儲存空間,以便隨後寫入檔案;或者存放從磁碟讀取檔案的內容。可以使用[NSMutableData data]建立可變資料空間;

  

  

  歸檔(編碼)

//建立一塊可變資料區 NSMutableData *data = [NSMutableData data];//將資料連線一個NSKeyedArchiver對象 NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWrittingWithMutableData:data];//開始存檔對象,儲存的資料會存檔到data中[archiver encodeObject:person1 forKey:@"person1"];[archiver encodeObject:person2 forKey:@"person2"];//存檔完畢。一定要調用finishEnCoding方法[archiver finishEncoding];//將存檔的資料,寫到檔案中[data writeToFile:filePath atomically:YES];

   解檔(解碼)

//從檔案中擷取資料NSData *data [NSData dataWithContentsOfFile:filePath];//根據擷取到的資料,解析成一個NSKeyedUnarchiver對象NSKeyUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];Person *p1 = [unarchiver decodeObjectForKey:@"person1"];Person *p2 = [unarchiver decodeObjectForKey:@"person2"];//恢複完畢[unarchiver finishDeCoding];

 

***利用歸檔實現深複製

//臨時儲存一個person1對象NSData *data = [NSKeyedArchiver archiveDataWithRootObject:person1];Person *person2 = [NSKeyedUnarchiver unarchiveObjectWithData:data];

 

iOS筆記———資料存放區

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.