为了方便起见,我只使用一个具有两个属性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中。
答案 0 :(得分:0)
首先,您的设置对于此类数据来说完全荒谬。使用NSUserDefaults
。
其次,虽然您的解决方案会产生大量代码,但从您的应用委托中获取上下文会使其更加冗长。更好地简单地传递上下文。
第三,您可以非常确定当save
和之后进行抓取时,将会反映出更改。如果您得到意外结果,请检查以下可能性: