CoreData在“一对多”关系中编辑一个属性

时间:2010-12-28 06:43:11

标签: iphone core-data

我是CoreData的新手并且一直在寻找所有书籍和示例,但没有一个真正告诉我如何做到这一点,所以非常感谢任何帮助。

基本上,我有一对多关系的2个实体。 [在这种情况下,其他关系并不重要]

关系和实体:

enter image description here

现在,我可以使用NSFetchRequest基于给定的个人资料实体获得所有的MedicalCondition实体

NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"MedicalCondition" inManagedObjectContext:delegate.managedObjectContext];
request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"condition" ascending:YES]];
request.predicate = [NSPredicate predicateWithFormat:@"MedicalToProfile = %@", myProfile];
//request.fetchBatchSize = 20;

NSFetchedResultsController *frc = [[NSFetchedResultsController alloc]
                                   initWithFetchRequest:request
                                   managedObjectContext:delegate.managedObjectContext
                                   sectionNameKeyPath:nil
                                   cacheName:nil];

NSError *error;
BOOL success = [frc performFetch:&error];
NSArray *fetchedObjectsFromCore;
[request release];
if (success) {
    fetchedObjectsFromCore = [frc fetchedObjects];
}

这没关系。现在,当我想要更新一个特定条目时,问题就出现了。我不知道该怎么做。我可以添加更多的MedicalCondition对象就好了。但是当谈到编辑时,我不确定。

我唯一想到的方法是在实体中使用“ID”属性。我认为必须有一个比这更好的解决方案。请帮忙 !非常感谢。

2 个答案:

答案 0 :(得分:2)

如果您有一个来自有效上下文的Core Data对象,那么编辑它非常容易。修改对象数据,然后保存其上下文。假设你有一个MedicalCondition对象,你以某种方式得到了它。

MedicalCondition *condition;
// modify a field
condition.date = [NSDate date];

// save
NSError *error;
[managedObjectContext save:&error];

此外,如果您有一个给定的Profile对象,只要您不关心订单,就可以直接获取所有关联的MedicalCondition对象,而无需执行提取。

Profile *someonesProfile = ...;
someonesProfile.conditions

// and access a profile from a given MedicalCondition since
// it seems to be a bi-directional relationship.

MedicalCondition *someCondition = ...;
someCondition.profile.dateofbirth;

您应该为关系提供更有意义的名称,而不是MedicalToProfileProfileToMedication等。例如,可以使用:{/ p>而不是ProfileToMedical

medicalConditions

在语义上更好,并且在代码中读得更好:

someonesProfile.medicalConditions

答案 1 :(得分:1)

再次感谢Anurag。 我有点工作了。

这就是我做的方式

NSSet *newMedical = myProfile.ProfileToMedical;
NSMutableArray *arrayMedical = [NSMutableArray arrayWithArray:[newMedical allObjects]];

MedicalCondition *c = [arrayMedical objectAtIndex:1];
c.condition = @"Amazing";

它更新正确的地方:)

但现在我再次打电话

NSSet *details = myProfile.ProfileToMedical;

NSMutableArray *arrayDetail = [NSMutableArray arrayWithArray:[details allObjects]];

返回NSSet显示更新的条件为其他索引。我明白那是因为myProfile.ProfileToMedical未分类?所以我必须在查看/编辑属性之前先对数组进行排序,以确保一致性?

再次感谢