这是我的代码,
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
。
答案 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实体的细节。注意,由于这些是类方法,因此可以直接调用它们。