標籤:
1 概述
沙箱目錄:一種安全性原則,原理是只能允許自己的應用訪問目錄,而不許其他應用訪問。
子目錄:Documents 用於儲存非常大的檔案或需要非常頻繁更新的資料
NSArray *documentDirectory=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
documentDirectory是只有一個元素的數組,還需要取出路徑
NSString *myDocPath=[documentDirectory objectAtIndex:0];
Library Preferences用於存放應用程式的設定資料 Caches用於存放快取檔案
tmp 臨時檔案目錄 NSString *temDirectory=NSTemporaryDirectory();
2 持久化方式 資料儲存方式
屬性列表:是XML檔案,數組和字典可以與屬性列表檔案相互轉換。
NSArray和NSDictionary提供了讀寫屬性列表檔案的方法:+array/dictionaryWithContentsOfFile:
-initWithContentOfFile:
writeToFile:atomically:是否使用輔助檔案
擷取檔案代碼:
- (NSString *)applicationDocumentsDirectoryFile {擷取沙箱Documents目錄檔案的完整路徑 NSString *documentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *path = [documentDirectory stringByAppendingPathComponent:@"NotesList.plist"]; return path;}- (void)createEditableCopyOfDatabaseIfNeeded { NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *writableDBPath = [self applicationDocumentsDirectoryFile];擷取檔案目錄 判斷檔案是否存在:fileExistsAtPath: BOOL dbexits = [fileManager fileExistsAtPath:writableDBPath]; if (!dbexits) {若不存在則複製一個 NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"NotesList.plist"]; NSError *error; BOOL success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; NSAssert(success, @"錯誤寫入檔案");斷言函數,第一個參數為假時拋出異常 }}
讀取與寫入檔案代碼:程式的插入/刪除/查詢等無非是檔案的操作
//插入Note方法-(int) create:(Note*)model{ NSString *path = [self applicationDocumentsDirectoryFile]; NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:path]; NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat: @"yyyy-MM-dd HH:mm:ss"]; 將傳入的資料封裝成檔案所需格式 NSDictionary* dict = [NSDictionary dictionaryWithObjects:@[[dateFormat stringFromDate: model.date],model.content] forKeys:@[@"date",@"content"]]; *
setValue:forKey:
* [array addObject:dict]; [array writeToFile:path atomically:YES]; return 0;}//刪除Note方法-(int) remove:(Note*)model{ NSString *path = [self applicationDocumentsDirectoryFile]; NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:path]; for (NSDictionary* dict in array) { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 是把value取出來而不是key比較 //Note* note = [[Note alloc] init]; NSDate *date = [dateFormatter dateFromString:[dict objectForKey:@"date"]]; //note.content = [dict objectForKey:@"content"]; //比較日期主鍵是否相等 if ([date isEqualToDate:model.date]){ [array removeObject: dict]; [array writeToFile:path atomically:YES]; break; } } return 0;}//修改Note方法-(int) modify:(Note*)model{ NSString *path = [self applicationDocumentsDirectoryFile]; NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:path]; for (NSDictionary* dict in array) { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSDate *date = [dateFormatter dateFromString:[dict objectForKey:@"date"]]; NSString* content = [dict objectForKey:@"content"]; //比較日期主鍵是否相等 if ([date isEqualToDate:model.date]){ [dict setValue:content forKey:@"content"]; [array writeToFile:path atomically:YES]; break; } } return 0;}//查詢所有資料方法-(NSMutableArray*) findAll{ NSString *path = [self applicationDocumentsDirectoryFile]; //[self.listData removeAllObjects]; NSMutableArray *listData = [[NSMutableArray alloc] init]; NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:path]; for (NSDictionary* dict in array) { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; Note* note = [[Note alloc] init]; note.date = [dateFormatter dateFromString:[dict objectForKey:@"date"]]; note.content = [dict objectForKey:@"content"]; [listData addObject:note]; } return listData;}//按照主鍵查詢資料方法-(Note*) findById:(Note*)model{ NSString *path = [self applicationDocumentsDirectoryFile]; NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:path]; for (NSDictionary* dict in array) { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; Note* note = [[Note alloc] init]; note.date = [dateFormatter dateFromString:[dict objectForKey:@"date"]]; note.content = [dict objectForKey:@"content"]; //比較日期主鍵是否相等 日期欄位是主鍵 if ([note.date isEqualToDate:model.date]){ return note; } } return nil;}
iOS 開發指南 第11章 資料持久化之屬性列表 學習