ios - One-to-Many Relationship: CoreData -
i'm new coredata , have been stuck on issue. assistance appreciated.
information: have core data app entities; list , task. list , task have one-to-many relationship.
task.h
@class list; @interface task : nsmanagedobject @property (nonatomic, retain) nsstring * task; @property (nonatomic, retain) nsstring * note; @property (nonatomic, retain) list *list; @end
list.h
@class task; @interface list : nsmanagedobject @property (nonatomic, retain) nsstring * name; @property (nonatomic, retain) nsdate * datecreated; @property (nonatomic, retain) nsnumber * sortorder; @property (nonatomic, retain) nsset *task; @end @interface list (coredatageneratedaccessors) - (void)addtaskobject:(task *)value; - (void)removetaskobject:(task *)value; - (void)addtask:(nsset *)values; - (void)removetask:(nsset *)values; @end
i create lists using;
nsmanagedobjectcontext *context = [self managedobjectcontext]; if ([self.listtextfield.text length] == 0) { // quit here if no text entered [self dismissviewcontrolleranimated:yes completion:nil]; return; } // create new list. // create nsmanagedobject our database entity. list = [nsentitydescription insertnewobjectforentityforname:@"list" inmanagedobjectcontext:context]; // add new task object (which in turns adds our database). [list setvalue:self.listtextfield.text forkey:@"name"]; // current date , time. nsdate *todaydate = [nsdate date]; // add date object (which in turns adds our database). [list setvalue:todaydate forkey:@"datecreated"]; nserror *error = nil; // save object persistent store if (![context save:&error]) { nslog(@"can't save! %@ %@", error, [error localizeddescription]); } [self dismissviewcontrolleranimated:yes completion:nil];
i can update created lists using code below cellaccessorybuttontapped;
nsmanagedobjectcontext *context = [self managedobjectcontext]; if ([self.listtextfield.text length] == 0) { // delete object database. [context deleteobject:self.list]; nserror *error = nil; // save action persistent store if (![context save:&error]) { nslog(@"can't save! %@ %@", error, [error localizeddescription]); } [self dismissviewcontrolleranimated:yes completion:nil]; } else { // update existing task. [self.list setvalue:self.listtextfield.text forkey:@"name"]; // current date , time. nsdate *todaydate = [nsdate date]; // add date object (which in turns adds our database). [list setvalue:todaydate forkey:@"datecreated"]; nserror *error = nil; // save action persistent store if (![context save:&error]) { nslog(@"can't save! %@ %@", error, [error localizeddescription]); } } [self dismissviewcontrolleranimated:yes completion:nil];
i can navigate list.
my question how can create task list have navigated into? it's been 2 days , i've not been able find on google.
as advised have added;
@property (strong, nonatomic) list *selectedlist;
i have save method
nsmanagedobjectcontext *context = [self managedobjectcontext];
// saving new task. task *task = [nsentitydescription insertnewobjectforentityforname:@"task" inmanagedobjectcontext:context]; task.task = self.tasktext.text; task.note = self.notetext.text; task.list = self.selectedlist; nslog(@"the selected list is: %@", [self.selectedlist description]); nserror *error = nil; // save object persistent store if (![context save:&error]) { nslog(@"can't save! %@ %@", error, [error localizeddescription]); } [self.selectedlist addtaskobject:task]; [self dismissviewcontrolleranimated:yes completion:nil];
the new task created created in lists. possible working , i'm not fetching tasks based on list?
this fetch request when navigate list:
if (fetchedresultscontroller != nil) { return fetchedresultscontroller; } // create fetch request. nsfetchrequest *fetchrequest = [[nsfetchrequest alloc] init]; // create entity fetch data from. nsentitydescription *entity = [nsentitydescription entityforname:@"task" inmanagedobjectcontext:self.managedobjectcontext]; // set entity of fetch request. [fetchrequest setentity:entity]; // set amount fetched @ time [fetchrequest setfetchbatchsize:20]; // create sort descriptor. nssortdescriptor *sortdescriptor = [[nssortdescriptor alloc] initwithkey:@"task" ascending:no]; // attach sort descriptor fetch request. nsarray *sortdescriptors = [[nsarray alloc] initwithobjects:sortdescriptor, nil]; [fetchrequest setsortdescriptors:sortdescriptors]; // create fetch result controller using fetch request nsfetchedresultscontroller *thefetchedresultscontroller = [[nsfetchedresultscontroller alloc] initwithfetchrequest:fetchrequest managedobjectcontext:self.managedobjectcontext sectionnamekeypath:nil cachename:nil]; self.fetchedresultscontroller = thefetchedresultscontroller; thefetchedresultscontroller.delegate = self; // perform fetch. nserror *error = nil; if (![self.fetchedresultscontroller performfetch:&error]) { // handle error. nslog(@"unresolved error %@, %@", error, [error userinfo]); exit(-1); // fail } return fetchedresultscontroller;
you need keep track of list have navigated into. 1 way of doing create property called parentlist
@property(nonatomic,strong) list *parentlist
in view controller create task in. , before navigating view controller set property.
in task view controller insert similar list
object using task *reqdtask = [nsentitydescription insertnewobjectforentityforname:@"task" inmanagedobjectcontext:context];
, set values once save
button pressed.
[parentlist addtaskobject: reqdtask];
and ur done. create task
in task entity , map list
entity. hope helps.
**edit***
you need [parentlist addtaskobject: reqdtask];
before saving context.
add in nsfectresultscontroller
[fetchrequest setpredicate:[nspredicate predicatewithformat:@"list = %@",self.parentlist]];
so this
// create fetch request. nsfetchrequest *fetchrequest = [[nsfetchrequest alloc] init]; // create entity fetch data from. nsentitydescription *entity = [nsentitydescription entityforname:@"task" inmanagedobjectcontext:self.managedobjectcontext]; // set entity of fetch request. [fetchrequest setentity:entity]; // set amount fetched @ time [fetchrequest setfetchbatchsize:20]; // create predicate. [fetchrequest setpredicate:[nspredicate predicatewithformat:@"list = %@",self.parentlist]]; //continue
this bring task associated selected list.
Comments
Post a Comment