我保存时Core Data返回Null

时间:2012-11-26 00:57:11

标签: iphone core-data

这是我的代码,

hand是实体,addRounds是textField

-(IBAction)save{

[self dismissViewControllerAnimated:YES completion:nil];
[self.hand setValue:self.addRounds.text forKey:@"rounds"];
    NSError *error;
    if (![self.managedObjectContext save:&error]) {
            //Handle Error
    }
NSLog(@"%@", self.addRounds.text);
NSLog(@"%@", self.hand.rounds);

}

控制台输出

2012-11-25 16:51:18.847 App[3187:c07] 1
2012-11-25 16:51:18.848 App[3187:c07] (null)

所以,由于某种原因,它没有妥善保存。谁能请帮帮我!谢谢!

-(IBAction)save{

if (self.managedObjectContext == nil)
{
    self.managedObjectContext = [(RootAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
}


    Hand *hand = [NSEntityDescription insertNewObjectForEntityForName:@"Hand" inManagedObjectContext:self.managedObjectContext];
    [self dismissViewControllerAnimated:YES completion:nil];
    hand.rounds = nil;
    self.managedObjectContext = self.app.managedObjectContext;

    NSError *error;

    if (![self.managedObjectContext save:&error]) {
         //Handle Error
    }

}

修改

所以基本上共有4个视图。 1)使用Table视图查看,用户可以按“+”按钮 2)该视图允许用户将单元格添加到表格视图中 3)允许用户edit表格视图单元格 4)这是一个完全不同的视图,也允许用户编辑表格视图单元格。

我正在使用问题顶部的代码保存在两个视图3 & 4中。它在视图3中完美运行,但不是4 !!

UPDATE !!!

所以,我重新编写了应用程序,以便查看1& 4是应用程序中仅有的两个视图。当我push查看2并在视图1和4之间查看3时,它将我的managedObjectContext的rounds属性设置为null

1 个答案:

答案 0 :(得分:1)

您的手形实体的rounds属性是否为模型中的字符串?

首先,您应该将手实体的rounds属性上的类型设置为数字类型。 16位整数可能就足够了(我们说的是纸牌游戏,对吧?),但如果你愿意的话,你可以把它做得更大。

接下来将代码更改为:

-(IBAction)save{
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
NSNumber *rounds = [numberFormatter numberFromString:numberself.addRounds.text];

[self dismissViewControllerAnimated:YES completion:nil];
[self.hand setValue:rounds forKey:@"rounds"];
    NSError *error;
    if (![self.managedObjectContext save:&error]) {
            //Handle Error
    }
NSLog(@"%@", self.addRounds.text);
NSLog(@"%@", self.hand.rounds);

另外,我假设您已经插入了在此之前某处设置属性的手的实例。也许我不应该假设。您是否已初始化此托管对象实例self.hand,以指向商店中的数据?

例如,我喜欢使用延迟实例化:

- (Hand*)hand
{
    if (_hand = nil) {
        _hand = [NSEntityDescription insertNewObjectForEntityForName:@"Hand" inManagedObjectContext:self.managedObjectContext];
    }
    return _hand;
}

这假设是纯粹的创造导向设计。在大多数情况下,您需要编辑现有对象并更新其轮次数。为此,您应该尝试检索您正在编辑的Hand。你可以使用NSFetchRequest做到这一点,并且有数以万计的例子,所以我在此不再重复。如果没有匹配,这个getter会创建一个作为后退。此外,最佳做法是为Hand创建一个类别(可能是Hand + Edit.m),其中包含检索不同Hands,创建它们以及更新公共属性的方法。

我会在Hand对象类别中创建工作方法,如下所示:

+ (void)incrementRoundsOnHand:(Hand *)hand withManagedObjectContext:(NSManagedObjectContext *)context
+ (void)incrementRoundsBy:(NSUInteger)count onHand:(Hand *)hand withManagedObjectContext:(NSManagedObjectContext *)context
// or some sort of unique identifier, date, number, etc
+ (Hand *)handWithName:(NSString *)name withManagedObjectContext:(NSManagedObjectContext *)context 

然后我有handWithName :(或者其他)执行NSFetchRequest,如果没有匹配,创建一个新手并返回它。无论哪种方式,你都会得到回报。重要的是,您不需要在Hand托管对象类之外处理Hand实体的细节。注意,由于这些是类方法,因此可以直接调用它们。