启动之间不保存核心数据实体

时间:2014-04-07 22:27:09

标签: ios objective-c uitableview core-data

我遇到的问题是我正在做的事情。到目前为止,我的应用程序包含两个UITableView控制器和一个ViewController。该应用程序只是要求用户在UIAlert上输入列表的名称,并将其保存到核心数据,并将列表的名称放入第一个tableview。然后,用户单击列表的名称,并将其推送到列表中的内容,该内容为空,因为尚未填充。然后用户填充TableView,因此它会推送到单个视图控制器,您可以在其中输入所有信息并点击保存并将其另存为项目。所以我的问题是当我去添加它保存的项目但是当我重新启动我的应用程序时,列表仍然存在,但列表中的所有项目都消失了。如果您有任何建议让我知道,我不知道为什么会这样做!谢谢!

我把项目放在GitHub上,因为有很多代码,它也可以让你体验我的问题,并了解控制器的流程。 https://github.com/jackintosh7/test-master

我的添加项目.m:

- (IBAction)save:(id)sender {
    NSManagedObjectContext *context = [self managedObjectContext];

    // Create a 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 the object to persistent store
    if (![context save:&error]) {
        NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
    }

    [self dismissViewControllerAnimated:YES completion:nil];
}
@end

1 个答案:

答案 0 :(得分:2)

对未来非常有帮助:作为一个完整性检查,我首先检查列表中的项目是否实际被保存。您可以使用模拟器和CoreDataPro之类的工具来查看您的商店。当我第一次学习iOS编程和核心数据时,这非常有帮助: https://github.com/yepher/CoreDataUtility

使用上面的实用程序,我看到您的商品实际上保存到您的持久商店。

我看了一下你修改后的代码并进行了一些小编辑,似乎一切正常。

1)在AddViewController.h中:导入item.h和list.h.最重要的是,将List强属性添加到AddViewController,以便新项目引用适用的列表。

#import "Item.h" //Your forward @class definitions would probably work. 
#import "List.h"

@property (nonatomic, strong) List *list;    

2)WishListView.m prepareForSegue中的代码减少:只需将List和ManagedObjectContext传递给目标ViewController。

else if( [[segue identifier] isEqualToString:@"AddItem"] ) {
    destViewController.list = self.list;
    destViewController.managedObjectContext = self.managedObjectContext;
    destViewController.completionBlock = ^(BOOL saved){
            _items = nil;
            [[self tableView] reloadData];
    };
}

3)在AddViewController.m中创建NSEntityDescription而不是传递它。同时从我们创建的新list属性中保存List。

- (IBAction)save:(id)sender {
NSManagedObjectContext *context = [self managedObjectContext];
self.item = [NSEntityDescription insertNewObjectForEntityForName:@"Item"
                                          inManagedObjectContext:context];
self.item.name = self.name.text;
self.item.price = self.price.text;
self.item.desc = self.desc.text;
self.item.list = self.list;

NSError *error = nil;
// Save the object to persistent store
if (![context save:&error]) {
    NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
}

if( self.completionBlock ) {
    self.completionBlock(YES);
}
[self dismissViewControllerAnimated:YES completion:nil];

}