0

这是我的代码,

hand是实体,addRounds是一个文本字段

-(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) 使用表格视图查看,用户可以按“+”按钮 2) 此视图允许用户向表格视图添加单元格 3) 允许用户edit查看表格视图单元格 4) 这是一个完全不同的视图,它还允许用户编辑表格视图单元格。

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

更新!!!

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

4

1 回答 1

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

这假设了一个纯粹的面向创造的设计。在大多数情况下,您希望编辑现有对象并更新其轮数。为此,您应该首先尝试检索您正在编辑的手。你可以使用 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 实体的细节。请注意,由于这些是类方法,因此可以直接调用它们。

于 2012-11-26T03:26:46.930 回答