【问题标题】:iOS CoreData fetch in AppDelegate not reflecting CoreData valuesAppDelegate 中的 iOS CoreData 获取不反映 CoreData 值
【发布时间】:2014-08-02 03:46:17
【问题描述】:

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

我正在做的一个小演练。首次加载时,如果未找到托管对象,则会创建一个并为其设置布尔值 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。我完全关闭了应用程序(在多任务中终止)。我打开应用程序,我的应用程序委托获取并拉取值 1,我的主视图(视图 1)加载并获取并拉取值 0,我移动到下一个视图(视图 2),这也拉值为零。如果我重复该过程并将值切换回 1,则更改将反映在视图 1 和 2 中,并且应用程序委托仍显示值为 1。现在到底发生了什么?

我什至尝试添加 4 个布尔属性并尝试以相同的方式更改它们的值,它们会改变,但仅限于类。我在应用程序委托中仔细观察了它们,它们在应用程序委托中从 0 开始,在应用程序终止和重新加载后,它们的值仅在应用程序委托中更改为 1。对这些值的任何其他更改仅反映在应用委托之外完成的提取中。

我也被越狱了,所以我导航到我的应用程序文件夹并查看了 SQLite 数据库,一切都应该是任何属性的值为零我的应用程序委托仍然拉 1。人们没有'当说数据核心是b***h时,我不是在开玩笑!

这是我在这里的第一篇文章,希望我的描述性足够,如果没有,请告诉我你需要什么来帮助我。我很感激你善良的人可以提供的任何和所有帮助。我已经为此苦苦挣扎了两个长夜,但没有任何进展。请帮助我,你是我唯一的希望。 :]

有趣的旁注:我可以更改应用委托中的值,它们将反映在视图 1 和视图 2 中完成的提取中,但它们不会在应用委托中。

【问题讨论】:

  • 您能告诉我们每个请求返回的NSManagedObject 的数量吗(在应用委托、view1 和 view2 中)?

标签: ios objective-c core-data delegates


【解决方案1】:

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

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

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

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

【讨论】:

  • 假设您可以解决问题,您应该接受这个答案。
猜你喜欢
  • 1970-01-01
  • 2011-06-07
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-06
相关资源
最近更新 更多