【问题标题】:CoreData Edit one attribute in One to Many relationshipCoreData 在一对多关系中编辑一个属性
【发布时间】: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”属性。我认为必须有比这更好的解决方案。请帮忙 !非常感谢。

【问题讨论】:

    标签: iphone core-data


    【解决方案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;
    

    你应该给关系起更有意义的名字,而不是MedicalToProfileProfileToMedication等。例如,而不是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 请求,它定义了排序标准。
    猜你喜欢
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多