【发布时间】: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