2012-10-21 76 views
0

我成功地將數據保存到plist(本例中爲書籤列表),但似乎無法弄清楚如何防止用戶保存兩次相同的數據。我正在使用「moveRowAtIndexPath」重新排列書籤。當列表中有重複項時,它會在排序過程中導致崩潰。這裏是我的代碼:保存到Plist時防止重複

- (IBAction)addBookmarkButtonClicked:(id)sender { 

NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsPath = [paths objectAtIndex:0]; 
NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"Bookmarks.plist"]; 
NSMutableArray *bookmarksArray = [NSMutableArray arrayWithContentsOfFile:plistPath]; 

if (nil == bookmarksArray) { 
    bookmarksArray = [[NSMutableArray alloc] initWithCapacity:0]; 
} 

NSMutableDictionary *array = [[NSMutableDictionary alloc]init]; 

[array setObject:gameName.text.self forKey:@"gameName"]; 
[array setObject:gameRating.text.self forKey:@"gameRating"]; 

[bookmarksArray addObject:array]; 
[bookmarksArray writeToFile:plistPath atomically: TRUE]; 

} 
+4

如果他們保存兩次會有什麼危害?此外,從代碼可讀性的角度來看,我認爲這是一個糟糕的主意,稱爲字典「數組」。 – rdelmar

+0

我剛修改了我的帖子。當用戶在書籤頁面上編輯時更改列表順序時,會導致崩潰。感謝代碼建議。我會做出這樣的改變。 –

+0

「更改列表順序」是什麼意思,並在崩潰時收到錯誤消息? – rdelmar

回答

0

在您添加項目到BookmarksArray你應該檢查,如果它已經存在。 您可以通過遍歷BookmarksArray中的所有項目並將每個項目的鍵與您嘗試添加的新值進行比較來完成此操作。例如:

BOOL itemExist, sameName, sameRating; 
itemExist=NO; 
sameName=NO; 
sameRating=NO; 

For (int i=0, i<[bookmarksArray count], i++) { 
    If ([gameName.text isEqualToString:[[bookmarksArray itemAtIndex:i] itemForKey:gameName]]) { 
     sameName=YES; 
    } 
    If ([gameRating.text isEqualToString:[[bookmarksArray itemAtIndex:i] itemForKey:gameRating]]) { 
     sameRating=YES; 
    } 
    if (sameName && sameRating) itemExist=YES; 
    sameName=NO; 
    sameRating=NO; 
} 

if (!itemExist) { 
    //item can be added 
}