0

这个让我很兴奋。在 applicationWillTerminate 中我做了两件事:将一些设置保存到应用程序设置 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];

}
4

1 回答 1

1

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

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

于 2010-06-07T15:17:19.380 回答