1

我很难为此找到示例/教程/信息。我想在我的应用程序中有一个“添加到收藏夹”按钮。这将从一个表格视图中获取一个单元格并将该单元格填充到“收藏夹”表格视图中。核心数据是解决这个问题的正确方向吗?我已经看到了一些关于使用 nsmutablearray 和/或 nsuserdefaults 的提示。不太确定该走哪条路。任何建议表示赞赏。

4

3 回答 3

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;
    }
于 2011-06-12T16:14:04.957 回答
2

如果您需要跨用户会话的持久存储,Core Data 可能是最好的选择。NSUserDefaults 更多的是——只是——用户默认值。虽然我认为在 NSUserDefaults 中保存用户的主页是合适的,但可能会变大的东西(如收藏夹)可能应该放在数据存储中。

如果您从不需要搜索列表,而只想保存并显示它,请同时查看 plist 文件。NSArray 可以使用writeToFile:atomically:. 您可以使用arrayWithContentsOfFile:.

如果您采用上述方法,需要注意的一件事arrayWithContentsOfFile:是静态类方法,而不是实例方法。

不过,Core Data 是迄今为止最灵活的选择。在 XCode 中尝试使用“使用核心数据”的“基于导航的应用程序”的模板应用程序。大多数示例代码都在那里。

于 2010-07-18T14:26:31.803 回答
0

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.

于 2011-06-12T16:24:20.850 回答