在不使用表视图的情况下更新核心数据属性

Posted

技术标签:

【中文标题】在不使用表视图的情况下更新核心数据属性【英文标题】: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)

【问题讨论】:

【参考方案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 初始化该类的一个实例并调用该实例上的方法

以上是关于在不使用表视图的情况下更新核心数据属性的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在不使用 recyclerview 的情况下创建水平列表视图?

如何在不使用临时表或视图的情况下在多个列上使用 PIVOT [重复]

如何在不将实例模型添加到数据库的情况下向实体模型添加FK约束?

表视图控制器不显示更新的核心数据值

是否可以在不刷新其他单元格的情况下刷新 ui 表视图的一部分?

plsql表更新后视图未更新