我在我的模型中添加了一个新实体,它加载正常,但内存中的更改不会持久保存到磁盘。我在汽车对象上设置的值在内存中工作正常,但在按下主页按钮时(在模拟器中)不会持久保存到磁盘。我在我的应用程序中的另一个实体上使用几乎完全相同的代码,并且其值保持在磁盘上(核心数据 - > sqlite3);有没有人知道我在这里俯瞰什么? Car是托管对象,汽车对象的NSMutableArray中的汽车和Car是实体,Visible是我试图设置的实体的属性。 谢谢你的帮助。 斯科特
- (void)viewDidLoad {
myAppDelegate* appDelegate = (myAppDelegate*)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext* managedObjectContex = appDelegate.managedObjectContext;
NSFetchRequest* request = [[NSFetchRequest alloc] init];
NSEntityDescription* entity = [NSEntityDescription entityForName:@"Car" inManagedObjectContext:managedObjectContex];
[request setEntity:entity];
NSSortDescriptor* sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Name" ascending:YES];
NSArray* sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortDescriptor release];
NSError* error = nil;
cars = [[managedObjectContex executeFetchRequest:request error:&error] mutableCopy];
if (cars == nil) {
NSLog(@"Can't load the Cars data! Error: %@, %@", error, [error userInfo]);
}
[request release];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath {
Car* car = [cars objectAtIndex:indexPath.row];
if (car.Visible == [NSNumber numberWithBool:YES]) {
car.Visible = [NSNumber numberWithBool:NO];
[tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryNone;
}
else {
car.Visible = [NSNumber numberWithBool:YES];
[tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;
}
}
以下是我的持久性商店协调员选项:
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES],
NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES],
NSInferMappingModelAutomaticallyOption, nil];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
}
答案 0 :(得分:2)
当您向应用程序的托管对象上下文添加新实体时,您必须使用托管对象上下文的-save:
方法来保存这些更改。
我强烈建议您阅读Apple的Core Data Programming Guide,了解核心数据对象和方法,以及如何创建,保存,删除和修改实体。
答案 1 :(得分:1)
我在这一棵树上完全咆哮着。
帮助我发现问题的原因是使用此执行参数打开核心数据跟踪:-com.apple.CoreData.SQLDebug 1
原来我在选择如何显示可见值(我没有发布代码)时遇到了逻辑问题,这导致了错误。核心数据正在做正确的事情,只有在值不同时才写出更改,但我无法分辨,因为我显示的值不正确。
答案 2 :(得分:0)
我怀疑Alex有正确的答案,但您可以发布显示创建 NSManagedObject的代码吗?
然后Alex是对的,你没有保存数据。由于您说您添加了保存例程,因此共享该代码。