如果我想从核心数据中获取实体的所有属性,我的fetchedResultsController方法如何?我只知道并了解如何获取tableView的数据,我认为这就是我所有困惑的来源。 这是我的核心数据设置:
我试图用我的设置实体拥有的所有属性填充一个数组,并在我的调试控制台中通过NSLog输出显示这些值。
这是我到目前为止所做的改变:
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSManagedObject *newEntry = [NSEntityDescription insertNewObjectForEntityForName:@"Setting" inManagedObjectContext:context];
//NSManagedObject *newSetting = [NSEntityDescription insertNewObjectForEntityForName:@"Setting" inManagedObjectContext:context];
[newEntry setValue: @"StudiSoft" forKey:@"settingName"];
if (_overrideSysTimeSwitch.on) {
[newEntry setValue: @YES forKey:@"settingSysTimeOverride"];
//editSetting.settingSysTimeOverride = @YES;
NSLog(@"IF A");
} else {
//[newEntry setValue: @NO forKey:@"settingSysTimeOverride"];
//editSetting.settingSysTimeOverride = @NO;
NSLog(@"IF B");
}
if (_timeFormatSwitch.on) {
//[newEntry setValue: @YES forKey:@"settingTimeFormat"];
//editSetting.settingTimeFormat = @YES;
NSLog(@"IF C");
} else {
//[newEntry setValue: @NO forKey:@"settingTimeFormat"];
//editSetting.settingTimeFormat = @NO;
NSLog(@"IF D");
}
[self.settingsArray addObject:@"StudiSoft"];
NSError *error;
[context save:&error];
我正在使用此代码剪切,并且我能够修改核心数据内容。 但是,每次运行此代码时,它当然会添加一个新对象。
我一直在寻找一种方法来更新我的实体中的现有属性,或修改它们,但我找不到它们。 无论如何,这是迈向正确方向的一个很好的一步。
我创建了一个全新的项目,只有一个视图,一旦我在主视图上工作,我将尝试使用segues ....
但是现在,我将如何更新或更改现有属性?
谢谢你们!
这是我的editSave方法,用于在核心数据中存储一些数据:
- (IBAction)editSave:(UIBarButtonItem *)sender
{
if ([_editSaveButton.title isEqualToString:@"Edit"])
{
[self setTitle:@"Edit Settings"];
//self.title = @"Edit Settings";
_overrideSysTimeSwitch.userInteractionEnabled = YES;
_timeFormatSwitch.userInteractionEnabled = YES;
_editSaveButton.title = @"Save";
} else if ([_editSaveButton.title isEqualToString:@"Save"])
{
[self setTitle:@"Settings"];
//self.title = @"Settings";
_overrideSysTimeSwitch.userInteractionEnabled = NO;
_timeFormatSwitch.userInteractionEnabled = NO;
_editSaveButton.title = @"Edit";
// #############################################################
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
//NSManagedObject *newEntry = [NSEntityDescription insertNewObjectForEntityForName:@"Setting" inManagedObjectContext:context];
//[newEntry setValue: @"StudiSoft" forKey:@"settingName"];
/*NSString *firstName = [anEmployee firstName];
Employee *manager = anEmployee.manager;
Setting *newSetting = [NSString @"Test"];
[newSetting setValue:@"Stig" forKey:@"settingName"];
[aDepartment setValue:[NSNumber numberWithInteger:100000] forKeyPath:@"manager.salary"];*/
//editSetting.settingName = @"Test";
if (_overrideSysTimeSwitch.on) {
//[newEntry setValue: @YES forKey:@"settingSysTimeOverride"];
editSetting.settingSysTimeOverride = @YES;
NSLog(@"IF A");
} else {
//[newEntry setValue: @NO forKey:@"settingSysTimeOverride"];
editSetting.settingSysTimeOverride = @NO;
NSLog(@"IF B");
}
if (_timeFormatSwitch.on) {
//[newEntry setValue: @YES forKey:@"settingTimeFormat"];
editSetting.settingTimeFormat = @YES;
NSLog(@"IF C");
} else {
//[newEntry setValue: @NO forKey:@"settingTimeFormat"];
editSetting.settingTimeFormat = @NO;
NSLog(@"IF D");
}
//[self.settingsArray addObject:@"StudiSoft"];
NSError *error = nil;
//if ([self.managedObjectContext hasChanges]) {
//NSLog(@"SAVE & DISMISS conetx has changed");
if (![context save:&error]) { // save failed
NSLog(@"Save failed: %@", [error localizedDescription]);
} else { // save succeeded
NSLog(@"Save Succeeded");
}
//}
//[self.tableView reloadData];
// #############################################################
}
}
调试输出:
2014-06-10 19:09:29.881 SettingsCoreData[508:60b] Entry #5: <Setting: 0x8f983e0> (entity: Setting; id: 0x8f97030 <x-coredata://FA78AB86-3225-4B1E-97DD-3F31F5323A18/Setting/p6> ; data: {
settingName = StudiSoft;
settingSysTimeOverride = 0;
settingTimeFormat = 0;
})
2014-06-10 19:09:29.883 SettingsCoreData[508:60b] Entry #6: <Setting: 0x8f98430> (entity: Setting; id: 0x8f97040 <x-coredata://FA78AB86-3225-4B1E-97DD-3F31F5323A18/Setting/p7> ; data: {
settingName = StudiSoft;
settingSysTimeOverride = 1;
settingTimeFormat = 1;
})
现在我应该能够在viewDidLoad中使用这样的东西,对吧?
if (editSetting.settingSysTimeOverride.boolValue == 0) {
_overrideSysTimeSwitch.on = NO;
} else {
_overrideSysTimeSwitch.on = YES;
}
但它并没有像我想象的那样奏效: - (
答案 0 :(得分:1)
接下来,您需要致电-performFetch:
上的NSFetchedResultsController
。如果响应为NO
,请确保检查响应并处理错误。
从那里填充NSFetchedResultsController
并准备好使用。然后,您可以通过-objectAtIndex:
抓取单个元素,也可以使用-fetchedObjects
抓取所有元素。
我建议只查看有关方法的文档,因为它有非常强大和清晰的文档。
如果您没有收到任何数据,请将其分解。获取您创建的NSFetchRequest
并针对-executeFetchRequest:error:
致电NSManagedObjectContext
,看看您是否收到任何数据。
NSFetchedResultsController
时出现问题。 NSFetchRequest
存在问题,或者您的商店中没有任何数据。听起来你需要阅读一本关于核心数据如何运作的书。
NSFetchRequest
是对核心数据的查询,以便可以从商店返回对象。您可以将NSFetchRequest
传递给NSFetchedResultsController
,以便NSFetchedResultsController
可以监控商店的更改,并让您的视图控制器知道这些更改何时发生。
NSFetchRequest
也可以直接针对NSManagedObjectContext
执行,您可以直接检索结果。您可以通过针对-executeFetchRequest:error:
致电NSManagedObjectContext
并获得NSArray
来做到这一点。然后,您可以检查NSArray
以查看是否有任何结果。
如果您不理解该段落,那么您需要退一步阅读有关Core Data的教程和/或阅读有关Core Data的书籍。我可以推荐一本关于这个主题的优秀书籍; - )