开发者

Saving Core Data From Multiple TableVIews [duplicate]

开发者 https://www.devze.com 2023-03-09 23:34 出处:网络
This question already has answers here: Querying Core Data with Predicates - iPhone (4 answers) Closed 2 years ago.
This question already has answers here: Querying Core Data with Predicates - iPhone (4 answers) Closed 2 years ago.

I have an app that has multiple tableviews and I want to use Core Data to capture all the data. I have two entities - freezers and items. In the first tableview I add a freezer and it saves correctly. I quit the app, re-open, and it is there. I click on the freezer (opening another tableview) and add s开发者_StackOverflowome items and I can see them in my new sectioned tableview. I quit my app, restart it, see the freezer, click on it and there are no items.

I have my managedObjectContext in my appDelegate and reference it from there using all views, so I am not creating multiple instances. Here is the code I use to save the items to a freezer, both the managedObjectContext and my itemsArray:

Item *item = (Item *)[NSEntityDescription insertNewObjectForEntityForName:@"Item" inManagedObjectContext:[delegate managedObjectContext]];
    [item setFreezer:freezerName];
    [item setName:name];
    [item setQuantity:quantity];
    [item setSection:section];
    [item setAdded:added];
    [item setNotes:notes];

    NSError *error = nil;
    if (![[delegate managedObjectContext] save:&error]) {
        NSLog(@"Freezer info didn't save.  Need to handle this.");
    }

    [items insertObject:item atIndex:0];

Here is the code I use in the ItemViewController to retrieve the items within viewDidLoad:

 NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"freezer == '%@'", freezerName];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:[delegate managedObjectContext]];
    NSSortDescriptor *sorts = [[NSSortDescriptor alloc] initWithKey:@"section" ascending:NO];
    NSArray *sort = [[NSArray alloc] initWithObjects:sorts, nil];

    [request setSortDescriptors:sort];
    [request setEntity:entity];
    [request setPredicate:predicate];

    NSError *error = nil;

    NSMutableArray *results = [[[delegate managedObjectContext] executeFetchRequest:request error:&error] mutableCopy];
    if(results == nil) {
        NSLog(@"Error fetching results... need to handle");
    }

    [self setItems:results];

    NSLog(@"items count:%d", [items count]);

The item count returned is zero.

I am completely stumped and have spent several hours searching online, trying different things, and I can't figure it out. I know there are some much smarter coders out there and I hope one of you can see what the problem is.


I would try to change the predicate to

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"freezer like %@", freezerName];

Hope that helps!


Maybe the problem is that you load data in

- viewDidLoad:

method. It's called only once when your view is loaded, so when underlaying data get's changed, your view controller is not aware about it.

You can either move your loading code to

- viewWillAppear:

method or introduce notifications to spread the information that data store has changed its state and reload table views upon that event.

The best way is probably to use NSFetchedResultsController as your data source, as its always aware of its data store changes. Check docs for reference to that class.

0

精彩评论

暂无评论...
验证码 换一张
取 消