代码之家  ›  专栏  ›  技术社区  ›  aminfar

使用核心数据在实体中插入和修改记录

  •  0
  • aminfar  · 技术社区  · 15 年前

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

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

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

    我不知道怎么写这些方法。(假设xib文件中的表有一个数组控制器)

    1 回复  |  直到 15 年前
        1
  •  7
  •   Marcus S. Zarra    15 年前

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

    第一种方法如下:

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

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

    对于您的另一个方法(应该在控制器中),您需要执行一个fetch来查找记录。

    - (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"];
    }
    

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

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

    更新

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

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

    你需要了解核心数据是如何工作的。苹果有很好的文档说明核心数据是如何工作的,如果失败了,你可以买我的书。关于如何在互联网上使用核心数据,有很多信息。

    我应该把第一种方法放在哪里?在我的档案里?

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

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

    在xib文件中从未定义控制器。它在xib文件中被引用。同样,你需要回到objective-c如何工作的开始,在你深入学习之前学习基础知识。