AppDelegate中的iOS Core Data提取不反映CoreData值

时间:2014-08-02 03:46:18

标签: ios objective-c core-data delegates

为了方便起见,我只使用一个具有两个属性bool值的实体(一个默认为1而另一个未设置)和一个托管对象。这些值更改与我的类中的核心数据匹配,但在我的应用程序委托中除外。

对我正在做的事情的一个小小的演练。在第一次加载时,如果没有找到托管对象,则创建一个,并将bool值设置为1。

    //in appdelegate
    NSError *error = nil;
NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"SettingsData" inManagedObjectContext:context];
[fetchRequest setEntity:entity];

SettingsData *gameSettings = [[context executeFetchRequest:fetchRequest error:nil]lastObject];
isLoaded = [gameSettings valueForKey:@"isLoaded"];
NSLog(@"isloaded: %i", isLoaded);

//checks for isLoaded bool which is defaulted to 1 in managed object
//creates nsmanagedpbject if value isn't there and sets default value for attribute bgMusic
if (!isLoaded) {

    NSLog(@"Create NsManObj and set default values");

    SettingsData *gameSettings = [NSEntityDescription insertNewObjectForEntityForName:@"SettingsData" inManagedObjectContext:context];

    [gameSettings setValue:[NSNumber numberWithBool:YES] forKey:@"bgMusic"];
    [_Bglayer play];
    if (![context save:&error]) {
        NSLog(@"Couldn't save: %@", [error localizedDescription]);
    }


}

我的主视图(视图1)加载,它获取托管对象并提取bgMusic的值,然后返回为1。

//main view (view 1)
AppDelegate *app = (AppDelegate *) [[UIApplication sharedApplication]delegate];
self.managedObjectContext = app.managedObjectContext;
NSManagedObjectContext *context = [self managedObjectContext];
NSError *error = nil;


NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"SettingsData" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
for (NSManagedObject *info in fetchedObjects) {
    NSLog(@"SoundBoolInMain: %@",[ info valueForKey:@"bgMusic"]);

我移动到下一个视图并更改切换,数据核心将使用新的bgMusic值更新,现在为0。

//next view (view 2)
AppDelegate *app = (AppDelegate *) [[UIApplication sharedApplication]delegate];
self.managedObjectContext = app.managedObjectContext;
NSManagedObjectContext *context = [self managedObjectContext];
NSError *error = nil;


NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"SettingsData" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
SettingsData *newsettings = [[self.managedObjectContext executeFetchRequest:fetchRequest error:nil]lastObject];

NSLog(@“SettingsBGBool:%@”,[newsettings valueForKey:@“bgMusic”]);

//Toggle Code
if ([[newsettings valueForKey:@"bgMusic"]  isEqual: @NO]) {
        NSLog(@"Tap1");
        [newsettings setValue:[NSNumber numberWithBool:YES] forKey:@"bgMusic"];
        if (![context save:&error]) {
            NSLog(@"Couldn't save: %@", [error localizedDescription]);
        }
    }else{
        NSLog(@"Tap0");
        [newsettings setValue:[NSNumber numberWithBool:NO] forKey:@"bgMusic"];
        if (![context save:&error]) {
           NSLog(@"Couldn't save: %@", [error localizedDescription]);
    }
    }
NSLog(@"bgVal: %@",[newsettings valueForKey:@"bgMusic"]);

我回到主视图(视图1)并且它获取键并且现在拉取值0.我完全关闭应用程序(多任务中的kill)。我打开应用程序,我的app委托提取并拉取值1,我的主视图(视图1)加载,它取值并拉取值0,我移动到下一个视图(视图2),这也是拉一个值为零。如果我重复该过程并将更改切换回1,则更改将反映在视图1和2中,而app delegate仍会显示值1。现在到底发生了什么?

我甚至尝试添加4个布尔属性并尝试以相同的方式更改它们的值并且它们会更改,但仅适用于类。我在app delegate中密切关注他们,他们在app delegate中以0开始,在杀死并重新加载app时,他们的值仅在app delegate中变为1。对这些值的任何其他更改仅反映在应用程序委托之外的提取中。

我也被监禁了,所以我已经导航到我的应用程序文件夹并查看了SQLite数据库,所有内容都应该是任何属性的值为零,我的应用程序委托仍然会拉出1.人们不是当说数据核心是ab *** h时开玩笑!

这是我在这里发表的第一篇文章,希望我已经足够描述了,如果没有,请告诉我你需要帮助我的内容。我非常感谢你能给人们提供的任何和所有帮助。我已经把头发拉了两个半夜,没有任何进展。请帮助我,你是我唯一的希望。 :

有趣的备注:我可以更改app delegate中的值,它们将反映在view1和view 2中完成的提取中,但它们不会在app delegate中。

1 个答案:

答案 0 :(得分:0)

首先,您的设置对于此类数据来说完全荒谬。使用NSUserDefaults

其次,虽然您的解决方案会产生大量代码,但从您的应用委托中获取上下文会使其更加冗长。更好地简单地传递上下文。

第三,您可以非常确定当save之后进行抓取时,将会反映出更改。如果您得到意外结果,请检查以下可能性:

  • 你没有保存。
  • 您在尝试检索之前再次更改了该值。
  • 您在保存之前检索该值。
  • 您正在显示另一个变量而不是检索到的值。
  • 您以错误的格式显示正确的值。