Core data 从核心数据获取实体的所有属性

Core data 从核心数据获取实体的所有属性,core-data,nsfetchedresultscontroller,Core Data,Nsfetchedresultscontroller,如果我想从核心数据中获取实体的所有属性,我的fetchedResultsController方法是什么样子的?我只知道并理解如何为tableView获取数据,我想这就是我所有困惑的根源。 以下是我的核心数据设置: 我试图用设置实体具有的所有属性填充数组,并通过调试控制台中的NSLog输出显示这些值 以下是我迄今为止所做的改变: AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; NS

如果我想从核心数据中获取实体的所有属性,我的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;
})

但是它并没有像我想象的那样工作:-(

接下来,您需要在
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;
    }