ios - Core Data Crashing When Pushing to View -


so first time working core data, , far hasn't been best experience. application far consists of 2 uitableview controllers , single viewcontroller. app asks user enter name of list on uialert , saves core data, , name of list put first tableview. far good. user clicks on name of list , pushes them contents on list, empty because hasn't been populated yet. problem when go populate app crashes. don't the viewcontroller. i'm lost i'll put necessary code here if there's more let me know. thanks!

error argv char ** 0xbfffeda8 0xbfffeda8

data model:

enter image description here

the .m add items list:

- (nsmanagedobjectcontext *)managedobjectcontext {     nsmanagedobjectcontext *context = nil;     id delegate = [[uiapplication sharedapplication] delegate];     if ([delegate performselector:@selector(managedobjectcontext)]) {         context = [delegate managedobjectcontext];     }     return context; }  - (id)initwithnibname:(nsstring *)nibnameornil bundle:(nsbundle *)nibbundleornil {     self = [super initwithnibname:nibnameornil bundle:nibbundleornil];     if (self) {         // custom initialization     }     return self; }  - (void)viewdidload {     [super viewdidload];     // additional setup after loading view. }  - (void)didreceivememorywarning {     [super didreceivememorywarning];     // dispose of resources can recreated. }  - (ibaction)cancel:(id)sender {     [self dismissviewcontrolleranimated:yes completion:nil]; }  - (ibaction)save:(id)sender {     nsmanagedobjectcontext *context = [self managedobjectcontext];      // create new managed object     nsmanagedobject *newitem = [nsentitydescription insertnewobjectforentityforname:@"item" inmanagedobjectcontext:context];     [newitem setvalue:self.name.text forkey:@"itemname"];     [newitem setvalue:self.price.text forkey:@"price"];     [newitem setvalue:self.desc.text forkey:@"description"];      nserror *error = nil;     // save object persistent store     if (![context save:&error]) {         nslog(@"can't save! %@ %@", error, [error localizeddescription]);     }      [self dismissviewcontrolleranimated:yes completion:nil]; } @end 

the .m show items in list:

- (nsmanagedobjectcontext *)managedobjectcontext {     nsmanagedobjectcontext *context = nil;     id delegate = [[uiapplication sharedapplication] delegate];     if ([delegate performselector:@selector(managedobjectcontext)]) {         context = [delegate managedobjectcontext];     }     return context; }  - (void)viewdidappear:(bool)animated {     [super viewdidappear:animated];      // fetch lists persistent data store     nsmanagedobjectcontext *managedobjectcontext = [self managedobjectcontext];     nsfetchrequest *fetchrequest = [[nsfetchrequest alloc] initwithentityname:@"item"];     self.lists = [[managedobjectcontext executefetchrequest:fetchrequest error:nil] mutablecopy];     self.items = [[managedobjectcontext executefetchrequest:fetchrequest error:nil] mutablecopy];     [self.tableview reloaddata]; }  - (id)initwithstyle:(uitableviewstyle)style {     self = [super initwithstyle:style];     if (self) {         // custom initialization     }     return self; }  - (void)viewdidload {     [super viewdidload];       // uncomment following line preserve selection between presentations.     // self.clearsselectiononviewwillappear = no;      // uncomment following line display edit button in navigation bar view controller.     // self.navigationitem.rightbarbuttonitem = self.editbuttonitem; }  - (void)didreceivememorywarning {     [super didreceivememorywarning];     // dispose of resources can recreated. }  #pragma mark - table view data source  - (nsinteger)numberofsectionsintableview:(uitableview *)tableview {     // return number of sections.     return 1; }  - (nsinteger)tableview:(uitableview *)tableview numberofrowsinsection:(nsinteger)section {     // return number of rows in section.     return self.items.count; }  - (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath {     static nsstring *cellidentifier = @"cell";     uitableviewcell *cell = [tableview dequeuereusablecellwithidentifier:cellidentifier forindexpath:indexpath];      // configure cell...     nsmanagedobject *item = [self.items objectatindex:indexpath.row];     [cell.textlabel settext:[item valueforkey:@"itemname"]];      return cell; }   - (bool)tableview:(uitableview *)tableview caneditrowatindexpath:(nsindexpath *)indexpath {     // return no if not want specified item editable.     return yes; }   - (void)tableview:(uitableview *)tableview commiteditingstyle:(uitableviewcelleditingstyle)editingstyle forrowatindexpath:(nsindexpath *)indexpath {     nsmanagedobjectcontext *context = [self managedobjectcontext];      if (editingstyle == uitableviewcelleditingstyledelete) {         // delete object database         [context deleteobject:[self.items objectatindex:indexpath.row]];          nserror *error = nil;         if (![context save:&error]) {             nslog(@"can't delete! %@ %@", error, [error localizeddescription]);             return;         }          // remove device table view         [self.items removeobjectatindex:indexpath.row];         [self.tableview deleterowsatindexpaths:[nsarray arraywithobject:indexpath] withrowanimation:uitableviewrowanimationfade];     } }     #pragma mark - segue  - (void)prepareforsegue:(uistoryboardsegue *)segue sender:(id)sender {     if ([[segue identifier] isequaltostring:@"showdetails"]) {         nsmanagedobject *selecteditem = [self.items objectatindex:[[self.tableview indexpathforselectedrow] row]];         addviewcontroller *destviewcontroller = segue.destinationviewcontroller;         destviewcontroller.items = selecteditem;     } }  @end 

and .m displaying lists:

- (nsmanagedobjectcontext *)managedobjectcontext {     nsmanagedobjectcontext *context = nil;     id delegate = [[uiapplication sharedapplication] delegate];     if ([delegate performselector:@selector(managedobjectcontext)]) {         context = [delegate managedobjectcontext];     }     return context; }  - (void)viewdidappear:(bool)animated {     [super viewdidappear:animated];      // fetch lists persistent data store     nsmanagedobjectcontext *managedobjectcontext = [self managedobjectcontext];     nsfetchrequest *fetchrequest = [[nsfetchrequest alloc] initwithentityname:@"list"];     self.lists = [[managedobjectcontext executefetchrequest:fetchrequest error:nil] mutablecopy];     self.items = [[managedobjectcontext executefetchrequest:fetchrequest error:nil] mutablecopy];     [self.tableview reloaddata]; }  - (id)initwithstyle:(uitableviewstyle)style {     self = [super initwithstyle:style];     if (self) {         // custom initialization     }     return self; }  - (void)viewdidload {     [super viewdidload];      // uncomment following line preserve selection between presentations.     // self.clearsselectiononviewwillappear = no;      // uncomment following line display edit button in navigation bar view controller.     // self.navigationitem.rightbarbuttonitem = self.editbuttonitem; }  - (void)didreceivememorywarning {     [super didreceivememorywarning];     // dispose of resources can recreated. }  #pragma mark - table view data source  - (nsinteger)numberofsectionsintableview:(uitableview *)tableview {     // return number of sections.     return 1; }  - (nsinteger)tableview:(uitableview *)tableview numberofrowsinsection:(nsinteger)section {     // return number of rows in section.     return self.lists.count; }  - (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath {     static nsstring *cellidentifier = @"cell";     uitableviewcell *cell = [tableview dequeuereusablecellwithidentifier:cellidentifier forindexpath:indexpath];      // configure cell...     nsmanagedobject *list = [self.lists objectatindex:indexpath.row];     [cell.textlabel settext:[list valueforkey:@"name"]];      return cell; }  -(ibaction)add:(id)sender {     uialertview *alert = [[uialertview alloc] initwithtitle:@"add list" message:@"create new wish list" delegate:self cancelbuttontitle:@"cancel" otherbuttontitles:@"save", nil];     [alert setalertviewstyle:uialertviewstyleplaintextinput];     [alert settag:2];     [alert show];     alert.delegate = self; } - (void) alertview:(uialertview *)alertview clickedbuttonatindex:(nsinteger)buttonindex {     if (buttonindex != 0 && alertview.tag == 2) {         uitextfield *tf = [alertview textfieldatindex:0];         nsmanagedobjectcontext *context = [self managedobjectcontext];          // create new managed object         nsmanagedobject *newlist = [nsentitydescription insertnewobjectforentityforname:@"list" inmanagedobjectcontext:context];         [newlist setvalue:tf.text forkey:@"name"];          nserror *error = nil;         // save object persistent store         if (![context save:&error]) {             nslog(@"can't save! %@ %@", error, [error localizeddescription]);           }          [self dismissviewcontrolleranimated:yes completion:nil];     }      nsmanagedobjectcontext *managedobjectcontext = [self managedobjectcontext];     nsfetchrequest *fetchrequest = [[nsfetchrequest alloc] initwithentityname:@"list"];     self.lists = [[managedobjectcontext executefetchrequest:fetchrequest error:nil] mutablecopy];     self.items = [[managedobjectcontext executefetchrequest:fetchrequest error:nil] mutablecopy];      [self.tableview reloaddata];  } - (bool)tableview:(uitableview *)tableview caneditrowatindexpath:(nsindexpath *)indexpath {     // return no if not want specified item editable.     return yes; }   - (void)tableview:(uitableview *)tableview commiteditingstyle:(uitableviewcelleditingstyle)editingstyle forrowatindexpath:(nsindexpath *)indexpath {     nsmanagedobjectcontext *context = [self managedobjectcontext];      if (editingstyle == uitableviewcelleditingstyledelete) {         // delete object database         [context deleteobject:[self.lists objectatindex:indexpath.row]];          nserror *error = nil;         if (![context save:&error]) {             nslog(@"can't delete! %@ %@", error, [error localizeddescription]);             return;         }          // remove list table view         [self.lists removeobjectatindex:indexpath.row];         [self.items removeobjectatindex:indexpath.row];         [self.tableview deleterowsatindexpaths:[nsarray arraywithobject:indexpath] withrowanimation:uitableviewrowanimationfade];     } } @end 

you should consider using nsfetchedresultscontroller make life easier, , app more efficient.

this incorrect:

self.lists = [[managedobjectcontext executefetchrequest:fetchrequest error:nil] mutablecopy]; self.items = [[managedobjectcontext executefetchrequest:fetchrequest error:nil] mutablecopy]; 

because these sets should contain different types of entity instance. but, don't need self.items. model contains relationship between list , item , should items specified list using relationship (or fetch request using relationship) when need it. , remove self.items, it's confusing you. in list view controller don't need items anyway.

when push show items, should getting selected list , passing that. have destviewcontroller.items = selecteditem; should have destviewcontroller.list = selectedlist;, , item controller uses relationship again display appropriate items.

and, when add new item, have associated self.list:

[newitem setvalue:self.list forkey:@"list"]; 

you should use managed object subclasses, , best way manage them using mogenerator.

aside: have if ([delegate performselector: should if ([delegate respondstoselector:, , log if don't context back...


Comments

Popular posts from this blog

PHPMotion implementation - URL based videos (Hosted on separate location) -

javascript - Using Windows Media Player as video fallback for video tag -

c# - Unity IoC Lifetime per HttpRequest for UserStore -