我很难找到这方面的示例/教程/信息。我想在我的应用程序中添加一个“添加到收藏夹”按钮。这将从一个tableview中获取一个单元格,并将该单元格填充到“favorites”表视图中。是核心数据接近这个的正确方向?我已经看到了一些关于使用nsmutablearray和/或nsuserdefaults的提示。不确定要走哪条路。任何建议表示赞赏。
答案 0 :(得分: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;
}
答案 1 :(得分:2)
如果您需要跨用户会话的持久存储,核心数据可能是最好的方法。 NSUserDefaults更多 - 仅仅是 - 用户默认值。虽然我认为在NSUserDefaults中保存用户的主页是合适的,但是可能会变大的东西(如收藏夹)可能会进入数据存储。
如果您从不需要搜索列表,并且只想保存并显示它,请查看plist文件。 NSArray可以使用writeToFile:atomically:
将数据直接写入plist文件。您可以使用arrayWithContentsOfFile:
获取该数据。
如果你采用上述方法,需要注意的一点是 - arrayWithContentsOfFile:
是静态类方法,而不是实例方法。
核心数据是迄今为止最灵活的选择。在XCode中尝试使用“使用核心数据”的“基于导航的应用程序”中的模板应用程序。大多数示例代码就在那里。
答案 2 :(得分:0)
如果收藏夹的数量可能仍然可以管理(比如说高达100-200左右),那么最好使用NSUserDefaults
方法。在这种情况下,如果您还有其他需求,我建议您使用Core Data。使用核心数据并非易事。将数据存储在单独的plist中也是一种很好的合理方法。
不要吓跑你远离核心数据。这是很棒的东西,我鼓励你学习它,但如果你在这种情况下使用它,你可能会过度工程化。