2010-06-07 235 views
0

这一个有我batty。在applicationWillTerminate中,我做了两件事:将一些设置保存到应用程序设置plist文件,并将更改后的数据更新到managedObjectContext中引用的SQLite数据库。问题有时候有效,而不是其他问题。模拟器和设备上的问题都是相同的。如果我在应用程序运行时点击主页按钮,我有时只能将数据存储在plist中并存储到CoreData存储中。看起来,这两个工作或两者都不工作,如果我切换执行顺序(saveState,managedObjectContext或managedObjectContext,saveState)没有区别。 我无法弄清楚如何发生这种情况。任何帮助是极大的赞赏。 lqapplicationWillTerminate看起来不一致

AppDelegate.m 

@synthesize rootViewController; 

- (void)applicationWillTerminate:(UIApplication *)application { 

    [rootViewController saveState]; 

    NSError *error; 

    if (managedObjectContext != nil) { 

     if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { 

      // Handle error 

      abort(); // Fail 
     } 
    } 

} 


RootViewController.m 

- (void)saveState { 

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 

    [userDefaults setInteger:self.someInteger forKey:kSomeNumber]; 
    [userDefaults setObject:self.someArray forKey:kSomeArray]; 

} 

回答

1

道歉为跛脚的问题。如果有人遇到类似的问题,我会自己回答。有两个错误同时发生,因此applicationWillTerminate没有被调用。第一个是我的xcdatamodel中的varchar长度错误。我的一些SQLite行尝试保存超出我在xcdatamodel中设置为最大值的varchar长度的字符串。这只出现在某些记录上,因此似乎导致保存不一致。第二个问题是错误地将一个可能的nil数组值保存到plist。当我解决这两个错误时,问题已经消失。

与此同时,我决定每次修改相关值而不是在applicationWillTerminate时保存到plist。我每次更改值时都会保存到Core Data managedObjectContext,而不是applicationWillTerminate,因为在终止应用程序之前可能会更改几百条记录。 (我希望这不是糟糕的形式或导致其他问题。)