applicationWillTerminate似乎不一致

时间:2010-06-07 02:36:33

标签: iphone xcode core-data savestate

这个让我很伤心。在applicationWillTerminate中我做了两件事:将一些设置保存到app settings plist文件,并将任何更改的数据更新到managedObjectContext中引用的SQLite数据库。问题是它有时是有效的而不是其他的。模拟器和设备上的问题相同。如果我在应用程序运行时点击主页按钮,我有时只能将数据存储在plist中并存储到CoreData存储中。似乎它既可以工作也可以不工作,如果我切换执行顺序(saveState,managedObjectContext或managedObjectContext,saveState)没有任何区别。 我无法弄清楚这是怎么发生的。任何帮助是极大的赞赏。 LQ

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 个答案:

答案 0 :(得分:1)

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

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