【发布时间】: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