Core data 从核心数据获取实体的所有属性
如果我想从核心数据中获取实体的所有属性,我的fetchedResultsController方法是什么样子的?我只知道并理解如何为tableView获取数据,我想这就是我所有困惑的根源。 以下是我的核心数据设置: 我试图用设置实体具有的所有属性填充数组,并通过调试控制台中的NSLog输出显示这些值 以下是我迄今为止所做的改变:Core data 从核心数据获取实体的所有属性,core-data,nsfetchedresultscontroller,Core Data,Nsfetchedresultscontroller,如果我想从核心数据中获取实体的所有属性,我的fetchedResultsController方法是什么样子的?我只知道并理解如何为tableView获取数据,我想这就是我所有困惑的根源。 以下是我的核心数据设置: 我试图用设置实体具有的所有属性填充数组,并通过调试控制台中的NSLog输出显示这些值 以下是我迄今为止所做的改变: AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; NS
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;
})
但是它并没有像我想象的那样工作:-(接下来,您需要在
NSFetchedResultsController
上调用-performFetch:
。确保检查响应,如果响应是否
,请处理错误
从那里,您的NSFetchedResultsController
将被填充并准备好使用。然后,您可以通过-objectAtIndex:
获取单个元素,也可以使用-fetchedObject
获取所有元素
我建议只查看可用方法的文档,因为它有非常强大和清晰的文档
更新
如果您没有收到任何数据,请将其分解。获取您创建的NSFetchRequest
,并针对您的NSManagedObjectContext
调用-executeFetchRequest:error:
,然后查看是否返回了任何数据
- 如果您这样做,则您对
的处理有问题NSFetchedResultsController
- 如果没有,则说明您的
有问题,或者您的存储中没有任何数据NSFetchRequest
NSFetchRequest
是对核心数据的查询,以便可以从存储中返回对象。您可以将NSFetchRequest
传递给NSFetchedResultsController
,以便NSFetchedResultsController
可以监视存储中的更改,并让您的视图控制器知道这些更改何时发生
NSFetchRequest
也可以直接针对NSManagedObjectContext
执行,您可以直接检索结果。您可以通过对NSManagedObjectContext
调用-executeFetchRequest:error:
并返回NSArray
来执行此操作。然后您可以检查NSArray
查看是否得到任何结果
如果您不理解该段落,那么您需要退后一步,阅读有关核心数据的教程和/或阅读一本关于核心数据的书。我可以推荐一本关于该主题的优秀书籍;-)嗨,马库斯,谢谢您的回复,我有-performFetch:在我的viewDidLoad中,请参阅上面更新的问题,但出于某种原因,它仍然没有起到任何作用。我只是不知道出了什么问题。我的项目在这里:如果有人可以看看它,请。。。我已经被这个问题困扰了一个多星期了,对于将这个iOS开发完全抛弃,我感到非常沮丧:-(你是否遵循了我建议的步骤?我不会为你解决它,但我很高兴带你完成调试问题的步骤。嗨,这不是我在viewDidLoad中所做的吗?如果(![[self-fetchedResultsController]performFetch:&error]){NSLog(@“error!%@,[error localizedDescription]);abort();}除此之外,我如何对我的NSManagedObject调用executeFetchedRequest:error?我很困惑?!无论如何,这是我的调试器输出,当它崩溃时,它会在该abort()处停止;正如预期的一样,除了一个例外,我还向核心数据添加了类型为String的settingName属性,以查看bool值是否会混淆。调试输出在我编辑的原始帖子中,因为注释太长了…谢谢Marcus!!!!!!
if (editSetting.settingSysTimeOverride.boolValue == 0) {
_overrideSysTimeSwitch.on = NO;
} else {
_overrideSysTimeSwitch.on = YES;
}