【问题标题】:Updating Core Data Properties WITHOUT using Table Views在不使用表视图的情况下更新核心数据属性
【发布时间】:2014-01-16 15:11:53
【问题描述】:

我有一个 POS 类型的应用程序,它使用 Core Data 使用表格视图存储日常销售交易。我正在尝试检索和更新某些核心日期属性,例如每日销售计数,而不使用表视图。表视图使用索引路径处的行来指向正确的对象(行)。我正在使用带有谓词的 Fetched Results 控制器来检索获取的对象(行) 问题:如何获取获取的行的索引,以便检索并更新正确的属性值?所有书籍和示例都使用表格视图来更改属性。

Entity Product
Product *product;
______________________________   

[self setupFetchedResultsController];        (This returns one object)

product = [NSFetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];  (objectAtIndexPath - Errors of course)

【问题讨论】:

    标签: ios core-data getter-setter


    【解决方案1】:

    我认为在这种情况下你不应该使用NSFetchedResultsController。如果您不想在UITableViewUICollectionView 中使用它,那么最好不要使用它。你可能最好使用NSFetchRequest,它很容易设置:

    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Entity"];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"someValue=1"];
    fetchRequest.predicate = predicate;
    NSError *error = nil;
    NSArray *array = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
    

    现在您有一个包含所有结果的 NSArray,您可以使用它而无需处理索引路径。

    如果您仍在为表格使用NSFetchedResultController(我不确定您是否这样做),那么每当您进行更改时,这些行仍然会更新。

    更新:要更新 fetch 返回的对象之一,可以这样完成:

    Entity *entity = [array firstObject];
    [entity setSomeProperty:@"CoreDataIsAwesome"];
    
    NSError *error = nil;
    if ([self.managedObjectContext save:&error]) {
        NSLog(@"Entity updated!");
    } else {
        NSLog(@"Something went wrong: %@", error);
    }
    

    【讨论】:

    • 我支持这个。当 NSFetchedResultsController 的委托与 tableview 耦合时,NSFetchedResultsController 非常棒,并且您计划显示多个结果。对于您的情况,FetchRequest 是更好的选择。
    • 感谢吉多的帮助。数组对于检索属性很有用,但我也需要更新属性。我需要检索一个对象,并将该属性加一。然后保存新值。
    • 再次感谢 Guido,第一行运行良好。但是设置和保存没有 Product *product = [productArray firstObject]; [产品集供应商:@"CoreDataIsAwesome"]; (无法识别的选择器)运行时错误 [self.managedObjectContext 保存]; (NSManagedObjectContext 没有可见界面声明选择器保存)编译错误
    • 再次感谢 Guido,第一行运行良好。但是设置和保存没有 Product *product = [productArray firstObject]; [产品集供应商:@"CoreDataIsAwesome"]; (无法识别的选择器)运行时错误 [self.managedObjectContext 保存]; (NSManagedObjectContext 没有可见界面声明选择器保存)编译错误
    【解决方案2】:

    您可以在获取的结果控制器上使用方法indexPathOfObject: 来返回给定对象的索引路径,然后进行更新。

    【讨论】:

    • 感谢帕特里克的快速回复!你能提供更多帮助吗?我用 indexPathOfObject 替换了 objectAtIndexPath,它给出了错误:No known class method for selector "indexPathOfObject" 可能是我的一个基本错误。如果你能帮我把这些点联系起来,将不胜感激!约翰
    • 您正试图调用 NSFetchedResultsController 类上的方法,而不是一个实例。相反,alloc 初始化该类的一个实例并调用该实例上的方法
    猜你喜欢
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多