Tuesday, 15 September 2015

CoreData model will always save an incorrect value for a Number type field


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:

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];      } 
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?


-- 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