0

我试图在互联网上找到我的问题的答案,但我找不到。我在核心数据中有一个简单的实体,它有一个 Value 属性(即整数)和一个 Date 属性。我想在我的 .m 文件中定义两种方法。

第一种方法是 ADD 方法。它有两个参数:一个整数值(由用户在 UI 中输入)和一个日期(默认为当前日期)。然后根据参数将记录插入到实体中。

第二种方法类似于增量方法。它使用 Date 作为键来查找记录,然后增加该记录的整数值。

我不知道如何编写这些方法。(假设我们有一个用于 xib 文件中的表的数组控制器)

4

1 回答 1

7

您正在寻找的第二种方法不适合添加到实体本身。它需要位于实体上方的某个位置,很可能在您的控制器对象中。

第一种方法如下:

- (void)updateDate:(NSDate*)date andValue:(NSInteger)value
{
  [self setValue:date forKey:@"date"];
  [self setValue:[NSNumber numberWithInteger:value] forKey:@"value"];
}

这是相当直接的 KVC(键值编码),我强烈建议您阅读 Apple 关于该主题的文档。

对于您的其他方法,应该在控制器中,您需要执行获取以查找记录。

- (id)findRecordForDate:(NSDate*)date inManagedObjectContext:(NSManagedObjectContext*)moc
{
  NSFetchRequest *request = [[NSFetchRequest alloc] init];
  [request setEntity:[NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:moc]];
  [request setPredicate:[NSPredicate predicateWithFormat:@"date == %@", date]];

  NSError *error = nil;
  NSArray *objects = [moc executeFetchRequest:request error:&error];
  NSAssert1(error == nil, @"Error fetching object: %@", [error localizedDescription]);

  return [objects lastObject];
}

- (void)incrementEntityWithDate:(NSDate*)date
{
  id entity = [self findRecordForDate:date inManagedObjectContext:[self managedObjectContext]];
  NSInteger value = [[entity valueForKey:@"value"] integerValue];
  value += 1;
  [entity setValue:[NSNumber numberWithInteger:value] forKey:@"value"];
}

这也是非常直接的核心数据访问。我建议您阅读 Core Data 的工作原理。

顺便说一句,使用日期作为唯一值是一个非常糟糕的设计。

更新

马库斯,谢谢你的回答。这真的很有帮助。我是核心数据的新手,所以我有几个问题要让事情更清楚。

第一种方法的代码设置了两个值,但它不会将新记录插入到表中。如何将新创建的记录插入表中?

你需要阅读 Core Data 是如何工作的。Apple 有很多关于 Core Data 如何工作的文档,如果失败了,你可以买我的书。互联网上有大量关于如何使用 Core Data 的信息。

我应该把第一种方法放在哪里?在我的 .m 文件中?

这是基本的Objective-C。如果你问这个问题,你需要退后一步,首先学习语言的基础知识。

您提到我需要在控制器中添加第二种方法。但是控制器是在 xib 文件中定义的。我怎样才能添加第二种方法呢?

控制器从未在 xib 文件中定义。它在 xib 文件中被引用。同样,在深入研究之前,您需要回到 Objective-C 工作原理的起点并学习基础知识。

于 2010-04-09T15:32:32.333 回答