【问题标题】:bool value does NOT get stored in core data stackbool 值不会存储在核心数据堆栈中
【发布时间】:2014-06-13 03:35:41
【问题描述】:

我试图在我的核心数据堆栈中简单地切换一个 BOOL 属性,并使用该 coredata bool 在我的 mainView 中的 viewDidLoad 中设置 UISwitch 的“状态”。

以下场景: 开关关闭,用户点击编辑(保存)UIButton,--> 将实体设置的 settingSysTimeOverride 属性从@NO 切换为@YES 下次应用程序启动时,在 viewDidLoad 中,我获取核心数据堆栈并查看 settingSysTimeOverride 的状态并使用它来 设置我的 UISwitch 的“状态”。

但由于某种原因,我的值没有存储到核心数据堆栈中。 附上整个项目,这里也是我的代码。

MainViewController.m

#import "MainViewController.h"
#import "AppDelegate.h"

@interface MainViewController ()

@property (nonatomic, strong)NSManagedObjectContext *managedObjectContext;
@property (nonatomic, strong)NSFetchedResultsController *fetchedResultsController;

@property (strong, nonatomic) NSMutableArray *settingsArray;
@end


@implementation MainViewController

@synthesize editSetting;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if (self) {

        // Custom initialization
    }
    return self;
}

- (NSManagedObjectContext *)managedObjectContext

{
    return [(AppDelegate*)[[UIApplication sharedApplication]delegate]managedObjectContext];

}

- (void)viewDidLoad

{
    [super viewDidLoad];

    NSManagedObjectContext *context = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Setting" inManagedObjectContext:context];

    [fetchRequest setEntity:entity];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"settingSysTimeOverride == %@", editSetting];

    [fetchRequest setPredicate:predicate];

    NSError *error;
    NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];

    if (fetchedObjects == nil) {
        NSLog(@"ERROR! %@ - %@", [error localizedDescription], [error userInfo]);
    } else {
        NSLog(@"FETCH SUCCESSFUL");
    }

    if ((fetchedObjects.count) >0) {
        // list array contents
        for (int i=0; i < (fetchedObjects.count); i++) {

            // output for debug purpose

            NSLog(@"Array-index [%i]: %@", i, fetchedObjects[i]);
        }
    }

    // check settingSysTimeOverride and set UISwitch-State
    if (editSetting.settingSysTimeOverride.boolValue == 0) {
        // turn switch to OFF - Position
        _overrideSysTimeSwitch.on = NO;
    } else {
        // turn switch to ON - Position
        _overrideSysTimeSwitch.on = YES;
    }
}

- (void)didReceiveMemoryWarning

{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)editSave:(UIBarButtonItem *)sender

{
    // toggle BOOL status of settingSysTimeOverride here
    //
}

- (IBAction)overrideSysTime:(UISwitch *)sender
{
}

- (IBAction)timeFormat:(UISwitch *)sender {
}
@end




MainViewController.h
#import <UIKit/UIKit.h>

#import "Setting.h"

@interface MainViewController : UIViewController <NSFetchedResultsControllerDelegate>
@property (nonatomic, strong)Setting *editSetting;
@property (strong, nonatomic) IBOutlet UIBarButtonItem *editSaveButton

@property (strong, nonatomic) IBOutlet UILabel *overrideSysTimeLabel;
@property (strong, nonatomic) IBOutlet UILabel *timeFormatLabel;

@property (strong, nonatomic) IBOutlet UISwitch *overrideSysTimeSwitch;
@property (strong, nonatomic) IBOutlet UISwitch *timeFormatSwitch;


- (IBAction)editSave:(UIBarButtonItem *)sender;
- (IBAction)overrideSysTime:(UISwitch *)sender;
- (IBAction)timeFormat:(UISwitch *)sender;
@end



AppDelegate.h
#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;

@end

设置.h

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@interface Setting : NSManagedObject
@property (nonatomic, retain) NSString * settingName;
@property (nonatomic, retain) NSNumber * settingSysTimeOverride;
@property (nonatomic, retain) NSNumber * settingTimeFormat;
@end





Setting.m
#import "Setting.h"

@implementation Setting
@dynamic settingName;
@dynamic settingSysTimeOverride;
@dynamic settingTimeFormat;

@end

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: core-data


    【解决方案1】:

    这是我做错的地方,我希望它可以帮助其他人在未来避免遇到同样的问题:

    我忘记将我的 NSManagedObject 指向我获取的数组的开头。

    NSManagedObject *matches;
    matches=[objects objectAtIndex:(0)];
    

    一段代码如下所示:

    NSManagedObjectContext *context;
    NSEntityDescription *entityDesc;
    NSFetchRequest *request;
    
    NSPredicate *pred;
    NSManagedObject *matches;
    
    NSArray *objects;
    
    NSUInteger elementsInArray;
    
    context = [self managedObjectContext];
    entityDesc = [NSEntityDescription entityForName:@"Setting" inManagedObjectContext:context];
    pred = [NSPredicate predicateWithFormat:@"(settingName = %@)", @"User-Settings"];
    
    request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDesc];
    [request setPredicate:pred];
    
    matches = nil;
    NSError *errorFS = nil;
    
    if (!(objects = [context executeFetchRequest:request error:&errorFS])) {
        // fetch failed
        NSLog(@"Fetch failed: %@ - %@", [errorFS localizedDescription], [errorFS userInfo]);
    } else {
        // fetch succeeded
        NSLog(@"Fetch Succeeded");
    }
    
    if ([objects count] == 0)
    {   // does not exist -> error?
    } else
    {
       matches=[objects objectAtIndex:(0)];  // <- HERE WAS THE ERROR !!!!!
       // # system time override switch
       if([[matches valueForKey:@"settingSysTimeOverride"] boolValue]) {
       _sysTimeOverrideSwitch.on = YES;
    } else {
       _sysTimeOverrideSwitch.on = NO;
    }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      相关资源
      最近更新 更多