【问题标题】:Core Data don't save my data. And I lose all saved data after the app is closedCore Data 不保存我的数据。应用程序关闭后我丢失了所有保存的数据
【发布时间】:2012-03-18 13:22:20
【问题描述】:

我在 Xcode 3.2.5 上创建了一个包含核心数据的应用程序,它运行良好。但是现在我安装了 Xcode 4.3.1,现在当我关闭应用程序时我的数据没有保存。 [context save:&error] - 不再工作(它不是保存数据)。 如果有人遇到同样的问题,请告诉如何解决。

【问题讨论】:

  • error 对象有没有信息???
  • 没有发生错误。一切都很好。但是当应用关闭时,数据也会松动。
  • 您使用的是什么类型的商店?例如,您不使用内存存储吗?

标签: iphone ios core-data ios5


【解决方案1】:

没有更多细节很难回答,但你的应用中应该有这种方法:

- (void)saveContext
{
NSError *error = nil;
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil)
{
    if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error])
    {
        /*
         Replace this implementation with code to handle the error appropriately.

         abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
         */
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    } 
}
}

因此,如果有一些错误,你会在控制台中得到它。

基本上,每次对数据进行更改时,都应该调用 saveContext 方法,而不仅仅是在关闭应用时。

还要注意核心数据随时间的演变,也许您的应用是为另一个 iOS 版本制作的,您的代码需要更新。

【讨论】:

  • 我有这个。它工作得很好。但现在它不起作用。我安装新 Xcode 的唯一改变。
  • 那么也许是在启动时重置了您的数据?
  • 是的,你是对的。每次我的预安装数据库时我都会重新加载))
【解决方案2】:

首先你检查崩溃日志,你可以在那里阅读崩溃的原因。我敢打赌,由于数据模型的限制,无法保存内存中的对象。

例如,对象字段之一的值是nil,但您在建模数据库时在 Xcode 中选择了Not Null 限制。检查您的数据库是否存在此限制:不为空,对值进行额外验证(最大值、最小值、字符串的正则表达式等)。

并在保存后添加此代码:

if (error) {
    NSLog(@"Data cannot be saved: %@", error);
}


UPD 正如 Paul.s 所说,正确的检查方法是:

if (![context save:&error]) {
    NSLog(@"Data cannot be saved: %@", error);
}

更多关于处理错误的信息,例如here

【讨论】:

  • 你检查- (BOOL)save:(NSError **)error的返回,如果返回NO,则表示它失败了,然后你应该询问错误。您永远不会真正立即询问错误。
  • 这个question/answer 给出了更长的描述
  • 在这种特殊情况下可能/可能不是,但这是 Apple API 遵循的模式,因此您应该坚持下去
猜你喜欢
  • 2014-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-21
相关资源
最近更新 更多