2010-07-18 70 views
1

我很難找到這個例子/教程/信息。我想在我的應用程序中添加「添加到收藏夾」按鈕。這將從一個tableview中獲取一個單元格,並將該單元格填充到「收藏夾」tableview中。核心數據是解決這個問題的正確方向嗎?我已經看到使用nsmutablearray和/或nsuserdefaults的一些提示。不確定要走哪條路。任何建議表示讚賞。「添加到收藏夾」按鈕的核心數據?

回答

2

如果您需要跨用戶會話持久存儲,則核心數據可能是最佳途徑。 NSUserDefaults更適用於 - 用戶默認值。雖然我認爲保存用戶的主頁是合適的,但在NSUserDefaults中,可能會變大的內容(如收藏夾)應該放在數據存儲區中。

如果您從不需要搜索列表,並且您只想保存並顯示它,請查看plist文件。 NSArray可以將數據直接寫入到writeToFile:atomically:的plist文件中。您可以使用arrayWithContentsOfFile:獲取該數據。

如果採用上述方法,有一點需要注意 - arrayWithContentsOfFile:是靜態類方法,而不是實例方法。

核心數據是迄今爲止最靈活的選擇。使用「使用核心數據」在XCode中嘗試使用「基於導航的應用程序」的模板應用程序。大多數示例代碼就在那裏。

+0

Coolbeans。感謝您的建議!我一定會深入核心數據。 – Chunjai 2010-07-20 04:37:39

4

我將此功能添加到了我的詳細視圖中。我的實體具有「最喜歡的」屬性。在詳細視圖按下「喜愛」按鈕設置爲喜愛的屬性的字符串,並開啓和關閉切換的明星形象:

- (IBAction)flagButtonPressed:(id)sender { 

    if (flagButtonSelected == 0) { 

     [flagButton setSelected:YES]; 

     flagButtonSelected = 1; 
     [flagButtonImage setImage:[UIImage imageNamed:@"yesFavorite.png"]]; 
     [myCoolEntity setValue:@"yesFlag" forKey:@"flagSet"]; 

    } else { 

     [flagButton setSelected:NO]; 

     flagButtonSelected = 0; 
     [flagButtonImage setImage:[UIImage imageNamed:@"noFavorite.png"]]; 
     [myCoolEntity setValue:@"noFlag" forKey:@"flagSet"]; 
    } 

    NSManagedObjectContext *context = myCoolEntity.managedObjectContext; 
    NSError *error = nil; 
    if (![context save:&error]) { 

     NSLog(@"Tried to save fav. Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 

} 

然後回到我的主表視圖,我在導航欄中的收藏夾按鈕用NSFetchedResultsController和謂詞查找具有「flagSet」屬性設置爲「yesFlag」的所有實體。

- (NSFetchedResultsController *)fetchedResultsController { 
    // Set up the fetched results controller if needed. 
    if (fetchedResultsController == nil) { 
     // Create the fetch request for the entity. 
     NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
     // Edit the entity name as appropriate. 
     NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyCoolEntity" inManagedObjectContext:managedObjectContext]; 
     [fetchRequest setEntity:entity]; 

     NSPredicate *predicate = [NSPredicate predicateWithFormat: @"flagSet like 'yesFlag'"];  

     [fetchRequest setPredicate:predicate]; 

     //set batch size 
     [fetchRequest setFetchBatchSize:20]; 

     // Edit the sort key as appropriate. 
     NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; 
     NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 

     [fetchRequest setSortDescriptors:sortDescriptors]; 

     // Edit the section name key path and cache name if appropriate. 
     // nil for section name key path means "no sections". 
     NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"name" cacheName:nil]; 
     aFetchedResultsController.delegate = self; 
     self.fetchedResultsController = aFetchedResultsController; 

     [aFetchedResultsController release]; 
     [fetchRequest release]; 
     [sortDescriptor release]; 
     [sortDescriptors release]; 
    } 

    return fetchedResultsController; 
} 

另外,在viewDidLoad中的細節視圖我顯示在收藏夾按鈕的星形圖像酌情:

//flag button 
    if ([myCoolEntity.flagSet isEqual:@"yesFlag"]) { 

     [flagButtonImage setImage:[UIImage imageNamed:@"yesFavorite.png"]]; 
     [flagButton setSelected:YES]; 
     flagButtonSelected = 1; 

    } else { 

     [flagButtonImage setImage:[UIImage imageNamed:@"noFavorite.png"]]; 
     [flagButton setSelected:NO]; 
     flagButtonSelected = 0; 
    } 
+0

這正是我所想過的,感謝這個偉大的例子,它一直在尋找www。 – ingenspor 2012-08-08 06:51:45

0

如果收藏夾的數量是可能保持可管理(比如高達100- 200左右),你最好使用NSUserDefaults的方法。在這種情況下,我只會建議使用核心數據,如果你也有其他需求。使用Core Data不是微不足道的。將數據存儲在單獨的plist中也是一種很好的合理方法。

不要嚇跑你遠離核心數據。這是很棒的東西,我鼓勵你學習它,但如果你在這種情況下使用它,你可能會過度工程。