iOS開發備忘錄:屬性列表文件數據持久化

屬性列表文件是一種XML文件,Foundation框架中的數組和字典等均可以於屬性列表文件相互轉換。數組

NSArray類經常使用讀寫屬性列表文件的方法app

+arrayWithContentsOfFile:類級構造方法,用於從屬性列表文件中讀取數據,建立NSArray對象。框架

-initWithContentsOfFile:實例構造方法,用於從屬性列表文件中讀取數據,建立NSArray對象。atom

-writeToFile:atomically:該方法把NSArray對象寫入到屬性列表文件中,第一個參數是文件名,第二個參數爲是否使用輔助文件,若是爲YES,則先寫入到一個輔助文件,而後輔助文件再從新命名爲目標文件,若是爲NO,則直接寫入到目標文件。spa

NSDictionary類經常使用讀寫屬性列表文件的方法:code

+dictionaryWithContentsOfFile:類級構造方法,用於從屬性列表文件中讀取數據,建立NSDictionary對象。對象

-initWithContentsOfFile:實例構造方法,用於從屬性列表文件中讀取數據,建立NSDictionary對象。blog

-writeToFile:atomically:該方法將NSDictionary對象寫入到屬性列表文件中。ip

屬性列表文件數據持久化具體方法,可參考如下實現方式:資源

假如在項目中手工建立了一個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菜單項清除一些再編譯。

相關文章
相關標籤/搜索