我很难为此找到示例/教程/信息。我想在我的应用程序中有一个“添加到收藏夹”按钮。这将从一个表格视图中获取一个单元格并将该单元格填充到“收藏夹”表格视图中。核心数据是解决这个问题的正确方向吗?我已经看到了一些关于使用 nsmutablearray 和/或 nsuserdefaults 的提示。不太确定该走哪条路。任何建议表示赞赏。
3 回答
我将此功能添加到我的详细信息视图中。我的实体有一个“最喜欢的”属性。在详细视图中按下“收藏夹”按钮为收藏属性设置一个字符串,并打开和关闭星形图像:
- (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;
}
如果您需要跨用户会话的持久存储,Core Data 可能是最好的选择。NSUserDefaults 更多的是——只是——用户默认值。虽然我认为在 NSUserDefaults 中保存用户的主页是合适的,但可能会变大的东西(如收藏夹)可能应该放在数据存储中。
如果您从不需要搜索列表,而只想保存并显示它,请同时查看 plist 文件。NSArray 可以使用writeToFile:atomically:
. 您可以使用arrayWithContentsOfFile:
.
如果您采用上述方法,需要注意的一件事arrayWithContentsOfFile:
是静态类方法,而不是实例方法。
不过,Core Data 是迄今为止最灵活的选择。在 XCode 中尝试使用“使用核心数据”的“基于导航的应用程序”的模板应用程序。大多数示例代码都在那里。
If the number of favorites is likely to remain manageable (say up to 100-200 or so), you'd probably better just use the NSUserDefaults
approach. In that case I would only suggest using Core Data if you also have other needs for it. It's not trivial to use Core Data. Storing the data in a separate plist is also a good reasonable approach.
Not to scare you away from Core Data. It's great stuff, and I encourage you to learn it, but you may be over-engineering if you use it for this scenario.