屬性列表文件是一種XML文件,Foundation框架中的數組和字典等都可以於屬性列表文件相互轉換。
NSArray類常用讀寫屬性列表文件的方法:
+arrayWithContentsOfFile:類級構造方法,用於從屬性列表文件中讀取數據,創建NSArray對象。
-initWithContentsOfFile:實例構造方法,用於從屬性列表文件中讀取數據,創建NSArray對象。
-writeToFile:atomically:該方法把NSArray對象寫入到屬性列表文件中,第一個參數是文件名,第二個參數為是否使用輔助文件,如果為YES,則先寫入到一個輔助文件,然后輔助文件再重新命名為目標文件,如果為NO,則直接寫入到目標文件。
NSDictionary類常用讀寫屬性列表文件的方法:
+dictionaryWithContentsOfFile:類級構造方法,用於從屬性列表文件中讀取數據,創建NSDictionary對象。
-initWithContentsOfFile:實例構造方法,用於從屬性列表文件中讀取數據,創建NSDictionary對象。
-writeToFile:atomically:該方法將NSDictionary對象寫入到屬性列表文件中。
屬性列表文件數據持久化具體方法,可參考以下實現方式:
假如在項目中手工創建了一個Contacts.plist文件,並在該文件中添加了幾條數據,如下圖所示。
當然也可以通過代碼直接創建plist文件。
接下來需要做的是將項目資源的Contacts.plist文件中數據復制到沙箱Documents目錄下。
//對文件進行預處理,判斷在Documents目錄下是否存在plist文件,如果不存在則從資源目錄下復制一個。 -(void)createEditableCopyOfDatabaseIfNeeded { NSFileManager *fileManager=[NSFileManager defaultManager]; NSString *writableDBPath=[self applicationDocumentsDirectoryFile]; BOOL dbexits=[fileManager fileExistsAtPath:writableDBPath]; if (!dbexits) { NSString *defaultDBPath=[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Contacts.plist"]; NSError *error; BOOL success=[fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; if (!success) { NSAssert1(0,@"錯誤寫入文件:‘%@’",[error localizedDescription]); } } } //獲取放置在沙箱Documents目錄下的文件的完整路徑 -(NSString *)applicationDocumentsDirectoryFile { NSString *documentDirectory=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *path=[documentDirectory stringByAppendingPathComponent:@"Contacts.plist"]; return path; }
createEditableCopyOfDatabaseIfNeeded方法中:
NSFileManager的copyItemAtPath:toPath:error:方法實現文件復制。
NSAssert1是Foundation框架提供的宏,它在斷言失敗的情況下拋出異常,類似的還有NSAssert和NSAssert2等。
applicationDocumentsDirectoryFile方法中:
stringByAppendingPathComponent:能夠在目錄后面追加文件名,返回完整的文件路徑。
沙箱Documents目錄下成功生成plist文件之后,就可以進行增、刪、改、查操作了。可參考如下代碼:
NSString *path=[self applicationDocumentsDirectoryFile]; //將屬性列表文件內容讀取到array變量中,也就是獲取了屬性列表文件中全部的數據集合 NSMutableArray *array=[[NSMutableArray alloc]initWithContentsOfFile:path]; //向array中添加一條新記錄 NSDictionary *newContact=[NSDictionary dictionaryWithObjects:@[contact.Title,contact.Type] forKeys:@[@"Title",@"Type"]]; [array addObject:newContact]; //刪除array中一條記錄 [array removeObjectAtIndex:0]; //刪除array中全部記錄 [array removeAllObjects]; for (NSDictionary* dict in array) { //通過for循環,找到需要修改的數據項,進行修改數據 [dict setValue:@"Test" forKey:@"Title"]; } //將array重新寫入屬性列表文件中 [array writeToFile:path atomically:YES];
注:完成后,需要選擇Product->Clean菜單項清除一些再編譯。