【问题标题】:iOS Core Data update: changes not savediOS 核心数据更新:未保存更改
【发布时间】:2026-01-11 07:55:02
【问题描述】:

我正在尝试在我的 iPad 应用程序中使用 Core Data。

我有一个这样的模型:

客户.h

#import <CoreData/CoreData.h>
@interface Customer : NSManagedObject
@property (nonatomic,strong) NSString *name;
@end

客户.m

#import "Customer.h"
@implementation Customer
@synthesize name;
@end

表格视图控制器显示数据库中的所有客户。通过选择客户,将启动详细信息视图推送序列并设置客户:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.

    CustomerDetailViewController *detailViewController = (CustomerDetailViewController*)   [segue destinationViewController];
    detailViewController.customer = [customers objectAtIndex:self.tableView.indexPathForSelectedRow.row];
}

在详细视图控制器中,如果更改,操作保存应该保存客户:

- (IBAction)save:(id)sender 
{
  AppDelegate *delegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
  NSManagedObjectContext *moc = [delegate managedObjectContext];
  self.customer.name = self.nameTextField.text;
  NSError *error;
  if (![moc save:&error]) 
  {
    NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
  }
}

虽然改了名字,但没有保存更改:虽然没有出现错误(错误为零,日志未显示)...

此外:

  BOOL customerHasChanges = [self.customer hasChanges];
  BOOL mocHasChanges = [moc hasChanges];

都是假的!

但是插入新实体可以正常工作:

Customer *customer = [NSEntityDescription insertNewObjectForEntityForName:@"Customer" inManagedObjectContext:self.managedObjectContext];
[customer setValue:@"Mars Inc." forKey:@"name"];
NSError *error; 
[self.managedObjectContext save:&error];

【问题讨论】:

  • 您如何检查它是否保存了客户名称?
  • 我怀疑您的托管对象上下文有问题。尝试通过托管对象获取它:customer.managedObjectContext.
  • @RyanR:我的意思是,虽然名称实际上已更改(self.customer.name = self.nameTextField.text),但实体并未更改(例如 [customer hasChanges] 返回 false)。
  • @Mundi:我试图从实体本身获取 managedObjectContext,但无论如何都不会保存更改。
  • -hasChanges 只会在您没有调用 save 时返回 true,但您的代码显示您正在立即调用 save。我在问您如何知道更改后的名称不会保留到数据库中-您是在查询 sqlite 还是什么?

标签: ios objective-c core-data ios7


【解决方案1】:

您的实施文件中有错误。使用@dynamic 而不是@synthesize

【讨论】:

  • 非常感谢!这解决了我的问题!能否请您快速解释一下为什么我应该使用@dynamic 而不是@property?
  • official documentation阅读所有相关信息。
  • 谢谢。它也适用于我。但是您能否解释一下为什么它不能与 @synthesize 一起使用?
  • 即使 SO OP 被指示阅读官方文档,他/她仍然希望得到一个简短的 * 答案,这将在他/她的职业生涯中的某个时间后留下巨大的知识真空! :-)