更新核心数据的特定属性

Posted

技术标签:

【中文标题】更新核心数据的特定属性【英文标题】:Updating a particular attribute of core data 【发布时间】:2012-02-27 13:33:29 【问题描述】:

我正在开发一个应用程序,我使用核心数据框架来维护数据库。我的实体包含三个属性,称为:应用程序列表的名称、开始时间和结束时间。我得到了正确的名称和开始时间属性值。 现在我的问题是我的结束时间属性应该包含下一个条目开始时间值的值。如果有人对此有任何想法,请告诉我。

谢谢

【问题讨论】:

【参考方案1】:

在创建下一个实体之前,您可以将 endTime 属性留空。在实体的 +Create 类别中,获取最后一个/第一个对象(假设您使用的是有序实体)并使用与新 startTime 相同的值更新 endTime。

如果您的对象未排序,则可能会有点棘手,因为所有实体都在一个集合中。但是如果是有序的,你很好,因为 NSOrderedSet 响应 lastObject(和 firstObject)。

享受,

达米安

编辑:这是一个示例工厂方法,它可以 1) 返回股票代码的现有股票实体或 2) 为该代码创建新实体。很容易修改以获取实体并根据您的排序顺序选择第一个/最后一个。再次查看 Hegarty 教授的 Core Data 类。

 + (Stock *)stockForSymbol:(NSString *)symbol inManagedObjectContext:(NSManagedObjectContext *)context 
  Stock *stock = nil;

  NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Stock"];
  request.predicate = [NSPredicate predicateWithFormat:@"symbol = %@",symbol];
  NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"symbol" ascending:YES];
  request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

  NSError *error = nil;
  NSArray *matches = [context executeFetchRequest:request error:&error];

  if (!matches || [matches count] > 1) 
      // handle error
   else if ([matches count] == 0) 
      stock = [NSEntityDescription insertNewObjectForEntityForName:@"Stock" inManagedObjectContext:context];
      stock.symbol = symbol;
      stock.strategyPosition = [NSNumber numberWithInt:StrategyPositionFlat];
      stock.userPosition = stock.strategyPosition;
      stock.userOwns = [NSNumber numberWithBool:NO];
   else 
      stock = [matches lastObject];
  
  return stock;

【讨论】:

我需要创建两次托管对象上下文的实例吗? 绝对不是——你要做的是在创建第二个时检索第一个。稍后我会附上一个代码示例,但我了解这个的地方是 Paul Hegarty 的斯坦福“iPad 和 iPhone 应用程序开发”课程中的两个 Core Data 类。这些课程至关重要,他解释了所有关于 Core Data 实体的类别和工厂方法。不过我会发布一个简单的。

以上是关于更新核心数据的特定属性的主要内容,如果未能解决你的问题,请参考以下文章

如何查询具有特定属性值的核心数据对象

Xcode 8.1 核心数据获取特定属性

实体框架核心更新-数据库特定迁移

使用特定对象而不是对象属性获取核心数据

如何在核心数据模型iOS中找出特定属性索引的值

核心数据:禁用特定属性的撤消。推荐的方法不起作用