“添加到收藏夹”按钮的核心数据?

时间:2010-07-18 05:08:02

标签: iphone core-data nsmutablearray nsuserdefaults favorites

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

3 个答案:

答案 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中也是一种很好的合理方法。

不要吓跑你远离核心数据。这是很棒的东西,我鼓励你学习它,但如果你在这种情况下使用它,你可能会过度工程化。