xcode - Struggling with CoreData relationships and deleting objects -
i'm relatively new objective-c , trying work way through learning coredata, albeit tons of google searches. have grasp of mysql , relational tables, can't seem wrap mind around how entities relate each other in coredata.
i create little projects myself when learning coredata, put simple concept of automotive service tracker (like oil changes, brake work, etc).
i've got 2 entities representing vehicles , oil changes ...
and
... respective relationships. i'm not if require one-to-one or one-to-many relationship vehicle have many oil changes, there many vehicles ... i'm guessing that's first thing need understanding.
i'm using sqllite manager watch what's going on data model. when add vehicles vehicle entity (basically saving uitextfields) can see objects in correct entity ...
... , when add oil changes particular vehicle, can see objects being put in proper entity ...
.. can see following, there seems disconnect when trying associate particular oil change particular vehicle ...
now, important questions ...
1). how individual oil changes relate respective vehicles? right oil changes displayed regardless of vehicle selected. i'm sure related updating fetched results query, can see displayed tables, i'm not getting respective oil change respective vehicle.
2). , might solved understanding question 1 ... if delete particular vehicle, need delete oil changes related vehicle.
my save method below.
- (ibaction)save:(id)sender { oil *oil = [nsentitydescription insertnewobjectforentityforname:@"oil" inmanagedobjectcontext:self.managedobjectcontext]; vehicle *vehicle = [nsentitydescription insertnewobjectforentityforname:@"vehicle" inmanagedobjectcontext:self.managedobjectcontext]; // vehicle // newoil.vehicle = whichvehicle.text; oil.vehicle = vehicle; // not working // format: mileage nsnumberformatter *numberformat = [[nsnumberformatter alloc] init]; [numberformat setnumberstyle:nsnumberformatterdecimalstyle]; nsnumber *mynumber = [numberformat numberfromstring:oilmileage.text]; oil.oilmileage = mynumber; // format: date nsdateformatter *dateformat = [[nsdateformatter alloc]init]; [dateformat setdateformat:@"mm-dd-yyyy"]; oil.oildate = [dateformat datefromstring:oildate.text]; // format: notes oil.oilnotes = oilnotes.text; // save context appdelegate *appdelegate = (appdelegate *)[[uiapplication sharedapplication] delegate]; [appdelegate savecontext]; }
->
->
->
->
ok, i'm attempting integrate dan shelly has suggested (which makes total sense) i've run snag need little more guidance on.
my mainvc isn't using tableview display vehicles (i've limited total vehicles 4 , i'm representing them icons , tying them vehicleids in coredata) ... anyway, since it's not tableview can't use following:
vehicle *existingvehicle = (vehicle *)[self.fetchedresultscontroller objectatindexpath:indexpath];
... therefore i'm having trouble creating instance fetched vehicle object can pass oilviewcontroller. i've got fetchrequest that's returning correct vehicleid out of coredata, need know how create object can pass on oilviewcontroller. fetchrequest looks ...
- (void)fetchobjects { nslog(@"dvc-fetching objects\n\n"); // create fetch request nsfetchrequest *fetchrequest = [[nsfetchrequest alloc] init]; nsentitydescription *entity = [nsentitydescription entityforname:@"vehicle" inmanagedobjectcontext:[self managedobjectcontext]]; [fetchrequest setentity:entity]; // set search criteria nspredicate *predicate = [nspredicate predicatewithformat:@"vehicleid == %@", vehicleid]; [fetchrequest setpredicate:predicate]; nserror *error; nsarray *array = [managedobjectcontext executefetchrequest:fetchrequest error:&error]; nslog(@"object id: %@", [array valueforkey:@"objectid"]); nsmanagedobjectid *moid = [array valueforkey:@"objectid"]; if (array != nil) { nsuinteger count = [array count]; // may 0 if object has been deleted. vehicle *existingvehicle = (vehicle *)[self.managedobjectcontext existingobjectwithid:moid error:&error]; nslog(@"count: %lu", (unsigned long)count); nslog(@"fetched vehicle id: %@",predicate); nslog(@"existingvehicle: %@", existingvehicle); } else { // deal error. }
}
but i'm getting following error:
terminating app due uncaught exception 'nsinvalidargumentexception', reason: '-[__nsarrayi istemporaryid]: unrecognized selector sent instance 0x11d5b660'
- the moid returning correctly "0x8bb1980 x-coredata://6681b331-29f0-448b-82f1-4660e033a460/vehicle/p1"
- the array count returning "1" [correct]
- and fetchvehicle id returning "vehicleid == 1" [also correct]
how create instance of vehicle returned object can pass over??
1) how individual oil changes relate respective vehicles?
you ... relating oil changes empty vehicle
object. visible in vehicle table (z_pk = [3,4,5]).
when need add new oil change, have access relative vehicle
object oil change adde for.
vehicle
object 1 select in vehicles view controller.
so instead of inserting vehicle
object each time create oil change, set relationship existing vehicle (you building object graph, think in terms of existing object , attaching them each other).
2) deletion:
from pictures seems set deletion rules should in order achieve goal. when delete vehicle
object cascade rule delete related oil change object along it. when delete oil change object related vehicle
oil relationship nullified.
so summarise:
get existing vehicle
object:
//in vehicle view controller : vehicle* existingvehicle = (vehicle*)[self.fetchedresultscontroller objectatindexpath:indexpath];
pass object along "oil change view controller". when add new oil change, set vehicle existing object:
oil *oil = [nsentitydescription insertnewobjectforentityforname:@"oil" inmanagedobjectcontext:self.managedobjectcontext]; oil.vehicle = existingvehicle; // 1 passed along scope //the rest of oil content setting //don't forget save!
you want change relationship type to-many type of relation ship (a vehicle
may have many oil changes).
not change oil change creation code.
to view oil changes specific vehicle
object, have use existing vehicle object passed oil change view controller , use in predicate of frc fetch request:
nspredicate* p = [nspredicate predicatewithformat:@"vehicle = %@",existingvehicle]; fetchrequest.predicate = p;
Comments
Post a Comment