CoreData 在一对多关系中编辑一个属性
Posted
技术标签:
【中文标题】CoreData 在一对多关系中编辑一个属性【英文标题】:CoreData Edit one attribute in One to Many relationship 【发布时间】:2010-12-28 06:43:11 【问题描述】:我是 CoreData 的新手,一直在寻找所有的书籍和示例,但没有一个真正告诉我如何做到这一点,因此非常感谢任何帮助。
基本上,我在一对多关系中有 2 个实体。 [在这种情况下,其他关系并不重要]
关系和实体:
现在我可以使用 NSFetchRequest 根据给定的 Profile 实体获取所有 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”属性。我认为必须有比这更好的解决方案。请帮忙 !非常感谢。
【问题讨论】:
【参考方案1】:如果你有一个来自有效上下文的 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;
你应该给关系起更有意义的名字,而不是MedicalToProfile
、ProfileToMedication
等。例如,而不是ProfileToMedical
,也许使用:
medicalConditions
语义更好,代码读起来更好:
someonesProfile.medicalConditions
【讨论】:
感谢您的快速回复, 不客气。我希望这对您有所帮助,如果您有任何问题,请告诉我。 我很抱歉命名问题,我会在解决此问题后立即更新它。我仍然无法更新MedicalCondition 的一项。如何更新正确的 MedicalCondition 条目?例如,我有 5 个 MedicalCondition.condition 条目,例如“a、b、c、d、e”,我想将“b”更改为“z”。我该怎么做呢?再次感谢 我不明白你的问题。有 5 个 MedicalCondition 对象吗?并且您想将第二个的值从“b”更改为“z”? 是的,有 5 个 medicalCondition 对象与特定的 Profile 对象相关,我想将第二个的 value[condition attribue] 从“b”更改为“z”。【参考方案2】:再次感谢阿努拉格。 我有点让它工作。
我就是这样做的
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 未排序?所以我必须在查看/编辑属性之前先对数组进行排序以确保一致性?
再次感谢
【讨论】:
是的,如果排序很重要,那么不要直接将它们作为 NSSet 访问。创建一个 fetch 请求,它定义了排序标准。以上是关于CoreData 在一对多关系中编辑一个属性的主要内容,如果未能解决你的问题,请参考以下文章
NSPredicate:“添加”一对多关系CoreData中所有实体的属性值