【问题标题】:applicationWillTerminate Appears to be InconsistentapplicationWillTerminate 似乎不一致
【发布时间】:2010-06-07 02:36:32
【问题描述】:

这个让我很兴奋。在 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];

}

【问题讨论】:

    标签: iphone xcode core-data savestate


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      • 2020-08-25
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      相关资源
      最近更新 更多