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

时间:2014-06-08 18:29:32

标签: core-data nsfetchedresultscontroller

如果我想从核心数据中获取实体的所有属性,我的fetchedResultsController方法如何?我只知道并了解如何获取tableView的数据,我认为这就是我所有困惑的来源。 这是我的核心数据设置: enter image description here

我试图用我的设置实体拥有的所有属性填充一个数组,并在我的调试控制台中通过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;
    }

但它并没有像我想象的那样奏效: - (

1 个答案:

答案 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的书籍。我可以推荐一本关于这个主题的优秀书籍; - )