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:
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
精彩评论