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


屬性列表文件是一種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菜單項清除一些再編譯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM