hi all,
in recent app project, decided go along , learn use core data storage. there no reason not plain old sqlite, wanted try out core data framework.
have, in view controller, uisegmentedcontrol 2 possible choices (labeled "yes" , "no"). there save button connected in ib following method:
if notice else clause, set variable x value of selected index of uisegmentedcontrol. there no error messages, value saved 1 (i checked .sqlite file used persistent store), though x =0 (i checked placing breakpoint there) when other segment selected. me decipher behavior?code:-(void)create_task { [txtdescription resignfirstresponder]; coredatalayer *dl = self.datalayer; //this wrapper class data context stored nsmanagedobjectcontext* context = dl.context; nsentitydescription* tareadescription =[dl descriptionforentityname:@"task"]; if (self.action ==@"new") { nsmanagedobject* newtask = [[nsmanagedobject alloc] initwithentity:tareadescription insertintomanagedobjectcontext:context]; nsnumber *comp = [nsnumber numberwithint:segcompleted.selectedsegmentindex]; [newtask setvalue:txtdescription.text forkey:@"desc"]; [newtask setvalue:[dateassignedcontrol date] forkey:@"date_assigned"]; [newtask setvalue:[datecompcontrol date] forkey:@"date_completed"]; [newtask setvalue: comp forkey:@"completed"]; [self.datalayer.context insertobject:newtask]; } else { [self.tasktoedit setvalue:txtdescription.text forkey:@"desc"]; [self.tasktoedit setvalue:[dateassignedcontrol date] forkey:@"date_assigned"]; [self.tasktoedit setvalue:[datecompcontrol date] forkey:@"date_completed"]; nsnumber * comp =[nsnumber numberwithint:segcompleted.selectedsegmentindex]; //this segmented control int x = [comp intvalue]; self.tasktoedit.completed = comp; } nserror *error; [dl.context save:&error]; uialertview *alert = [[uialertview alloc] initwithtitle:nil message:@"task has been saved." delegate:nil cancelbuttontitle:@"ok" otherbuttontitles: nil]; [alert show]; [self.navigationcontroller poptorootviewcontrolleranimated:yes]; }
-- edit ---
actually, when else clause executes, no changes saved @ all, not other controls, nor desc field. works fine when self.action==@"new".
a handful of thoughts
zeroth comment: value of self.tasktoedit , assigned
(why zero-based? well, thought of 1 after wrote other ones, it's interesting 1 , thought should @ top.)
@"new" 1 works , else 1 doesn't. 1 key difference nsmanagedobject being impacted.
first comment: don't use == compare strings, use isequaltostring:
== doesn't run compare: (at least afaik), compares pointer values. in general, believe bad form rely on pointers being same. might work, sense it's accident. can tell me it's guaranteed , that, don't care: don't it.
second comment: debugger friend
run code in debugger, setting breakpoint @ top of if statement , step-over 1 line @ time.
third comment: nslog can insightful
hey, don't know wtf going on, right, drop log statements in there too. can see interesting things when log them, values being nil.
fourth comment: subclass of nsmanagedobject?
know you're getting started, should generate nsmanagedobject subclasses entities , use them. don't have "setvalue:forkey:" stuff, instead set values properties. coredata magic done you.
let's had nsmanagedobject subclass named task has properties desc, date_assigned, date_completed, , completed. code more this:
code:if (self.action ==@"new") { task* newtask = [nsentitydescription insertnewobjectforentityforname:@"installrecord" inmanagedobjectcontext:context]; nsnumber *comp = [nsnumber numberwithint:segcompleted.selectedsegmentindex]; newtask.desc = txtdescription.text; newtask.date_assigned = [dateassignedcontrol date]; newtask.date_completed = [datecompcontrol date]; newtask.completed = comp; // [self.datalayer.context insertobject:newtask]; // inserted first statement } else { self.tasktoedit.desc = txtdescription.text; self.tasktoedit.date_assigned = [dateassignedcontrol date]; self.tasktoedit.date_completed = [datecompcontrol date]; nsnumber * comp =[nsnumber numberwithint:segcompleted.selectedsegmentindex]; //this segmented control int x = [comp intvalue]; self.tasktoedit.completed = comp; }
Forums iPhone, iPad, and iPod Touch iOS Programming
- iPhone
- Mac OS & System Software
- iPad
- Apple Watch
- Notebooks
- iTunes
- Apple ID
- iCloud
- Desktop Computers
- Apple Music
- Professional Applications
- iPod
- iWork
- Apple TV
- iLife
- Wireless
No comments:
Post a Comment