开发者

CoreData Edit one attribute in One to Many relationship

I am new to CoreData and been looking to all the books and examples but none of them really tell me how to do this, so any help is greatly appreciated.

Basically, I have 2 Entities in one to Many relation. [other relationships are not important in this case]

The relationship and entities:

CoreData Edit one attribute in One to Many relationship

Now I can get All the MedicalCondition Entity based on given Profile Entity using NSFetchRequest

NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"MedicalCondition" inManagedObjectContext:delegate.managedObjectContext];
request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"condition" ascending:YES]];
reques开发者_如何学编程t.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];
}

This is ok. Now the problem comes in when I want to update one particular entry. I am not sure how to do it. I can add more MedicalCondition object just fine. But when it comes to edit, I am not sure.

The only way I cant think of is to have "ID" attribute in entity. I think there must be a better solution than this. Please help ! Thankz so much.


If you have a Core Data object from a valid context, then editing it is very easy. Modify the object data, then save its context. Let's say you have a MedicalCondition object that you got hands on somehow.

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

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

Also if you have a given Profile object, you can get all associated MedicalCondition objects directly without having to perform a fetch as long as you do not care about order.

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;

You should give more meaningful names to the relationships instead of MedicalToProfile, ProfileToMedication, etc. For example, instead of ProfileToMedical, maybe use:

medicalConditions

which is semantically nicer, and reads better in code:

someonesProfile.medicalConditions


Thankz again Anurag. I kindna got it working.

this is how I did it

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

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

And It update the right place :)

But now when I call again

NSSet *details = myProfile.ProfileToMedical;

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

The return NSSet is show the updated condition to be at other index. I understand that is because myProfile.ProfileToMedical is unsorted? so I must always sort the array first before I view/edit attribute to ensure the consistency?

Thankz again

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜