在不使用表视图的情况下更新核心数据属性
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
。如果您不想在UITableView
或UICollectionView
中使用它,那么最好不要使用它。你可能最好使用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约束?