【问题标题】:Core Data objects deleted when iPhone crashediPhone 崩溃时删除的核心数据对象
【发布时间】:2015-04-05 01:30:58
【问题描述】:

我今天下午有一个奇怪的经历,我无法确定问题可能是什么。我一直在使用 Swift 开发一个 iPhone 应用程序,今天我把它拿出来进行测试。到目前为止,我只在连接到 Mac 时对其进行了测试。

当用户开车时,应用程序会跟踪位置并将其保存到 Core Data。一切都很好,数据正在保存。直到手机崩溃并且核心数据似乎已经清空。在手机崩溃之前,数据肯定已被保存,因为我将保存的路线覆盖在地图视图上,并且它肯定正在显示。而且删除数据的函数肯定没有被调用,因为我没有访问调用它的唯一视图控制器。

我的问题是,是否有其他人遇到过这种情况,或者是否存在已知问题,即如果手机崩溃,Core Data 可以被删除?

编辑:

这是我用来保存到 Core Data 的代码:

var context = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext!
        var savePosition = NSEntityDescription.insertNewObjectForEntityForName("Positions", inManagedObjectContext: context) as Positions

        savePosition.poi = false
        savePosition.time = currentTime
        savePosition.direction = currentDirection
        savePosition.latitude = currentLatitude
        savePosition.longitude = currentLongitude
        savePosition.game = currentGame

        context.save(nil)

我错过了一步吗?

【问题讨论】:

  • 数据已缓存,您可以毫无问题地使用它。但是只有在调用saveContext()时才会保存到持久化数据存储中
  • 当您说已保存时,您的意思是保存到我假设的持久存储中,但是什么样的存储?保存的数据在崩溃中丢失绝对不正常。我根本没见过。同意上面,听起来像 saveContext 没有发生。
  • 我已经添加了我的代码。我错过了 saveContext() 吗?我认为我的 context.save() 正在做这项工作?
  • nil 作为错误对象传递给save(),您就没有机会发现可能的错误...
  • 我不擅长跟踪我的错误!我刚刚开始,这是我需要努力的(许多)领域之一。但是那个 context.save() 应该和 saveContext() 做同样的保存工作?

标签: ios swift core-data


【解决方案1】:

使用 AppDelegate 中的此功能,您可以捕获错误并将它们显示在 UIAlertController 中。这可能有助于追踪您的数据发生了什么。

func saveContext() {
    var error: NSError? = nil

    if !managedObjectContext.hasChanges {
        return
    }

    if managedObjectContext.save(&error) {
        return
    }


    // Error occured
    let alertController = UIAlertController(
        title: NSLocalizedString("Error", comment: ""),
        message: "\(error?.localizedDescription)\n\(error?.userInfo)",
        preferredStyle: .Alert
    )

    let defaultAction = UIAlertAction(
        title: "Ok",
        style: .Default,
        handler: nil)

    alertController.addAction(defaultAction)

    self.navigationController?.topViewController.presentViewController(alertController, animated: true, completion: nil)
}

【讨论】:

  • 紫软,太好了。感谢您的帮助。我已经添加了代码,我会留意问题。
  • 祝你好运!并且不要忘记将所有出现的context.save(nil) 替换为appDelegate.saveContext() ;-)
猜你喜欢
  • 1970-01-01
  • 2023-03-12
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多