使用Core Data插入和修改实体中的记录

ami*_*far 0 entity core-data insert record nsarraycontroller

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

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

第二种方法就像增量方法.它使用Date作为键来查找记录,然后递增该记录的整数值.

我不知道如何编写这些方法.(假设我们在xib文件中有一个表控制器)

Mar*_*rra 7

您要查找的第二种方法不适合添加到实体本身.它需要位于实体之上,最有可能位于控制器对象中.

第一种方法如下:

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

这是相当直接的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"];
}
Run Code Online (Sandbox Code Playgroud)

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

另外,使用日期作为唯一是一个非常糟糕的设计.

UPDATE

马库斯,谢谢你的回答.这真的很有帮助.我是核心数据的新手,所以我有一些问题可以让事情变得更清晰.

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

您需要了解Core Data的工作原理.Apple拥有关于Core Data如何工作的精彩文档,如果失败,您可以购买我的书.有一些关于如何在互联网上使用核心数据的信息.

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

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

你提到我需要在控制器中添加第二种方法.但是控制器是在xib文件中定义的.如何添加第二种方法呢?

永远不会在xib文件中定义控制器.它在xib文件中引用.同样,在深入研究之前,您需要回到Objective-C的工作原理并学习基础知识.