【问题标题】:Update core data from web service. (insert/update/delete)从 Web 服务更新核心数据。 (插入/更新/删除)
【发布时间】:2015-09-09 08:32:01
【问题描述】:

我有一个从 Web 服务下载 json 内容的 restfull 应用程序。第一次调用 Web 服务时,我将所有对象缓存在核心数据中。 再次调用时出现问题。 我需要更新已更改的,删除不存在的并插入所有新的。我正在获取所有本地对象和所有接收到的对象,循环插入或更新,然后删除未修改的对象。问题是我的算法很烂,而且效率很低。使核心数据与 Web 服务保持同步的最佳做法是什么?

已编辑:

func updateRestaurantsFromJson(dataArray:[[String: AnyObject]]) {
    var currentRestaurants = getAllRestaurants()
    for restaurantDictionary in dataArray {
        if let restaurant = DBRestaurant.fromJson(restaurantDictionary) {
            if let index = find(currentRestaurants, restaurant) {
                currentRestaurants.removeAtIndex(index)
            }
        }
    }
    removeRestaurants(currentRestaurants)
}

我正在创建一个包含所有当前对象的数组,在 DBRESTaurant.fromJson 中插入/更新并删除未触及的对象。

class func fromJson(data: [String: AnyObject]) -> DBRestaurant? {
    if let id = data["id"] as? String {
        var obj = DBRestaurant.withId(id)
        var result: DBRestaurant
        if obj == nil {
            result = newRestaurant()
            result.restaurantID = id
        } else {
            result = obj!
        }
        result.updateWithJson(data)
        DataManager.save(nil)
        return result
    } else {
        return nil
    }
}

class func withId(id: String) -> DBRestaurant? {
    let fetchRequest = NSFetchRequest(entityName: kDBRestaurant)
    fetchRequest.predicate = NSPredicate(format: "restaurantID = %@", id)
    let restaurant = (self.managedObjectContext.executeFetchRequest(fetchRequest, error: nil) as! [DBRestaurant]).first
    return restaurant
}

【问题讨论】:

  • 您是否考虑过使用第三方库,例如 RestKit?
  • 老实说,我可以考虑更快地找到解决方案,但我真的很想了解事情是如何完成的。
  • 如果您希望在当前方法上使用 cmets,您需要显示代码

标签: swift rest core-data insert-update


【解决方案1】:

当您以 JSON 格式获取数据时,我假设您正在使用 Key: value 数据。 如果是这种情况,我会给您存储的每个对象一个 identifier 属性。这可以是任何东西,例如字符串或 int,您的应用可以使用它来识别对象。

然后,如果您获取对象,您只需将获取的对象的标识符与您在 CoreData 中的对象的标识符进行比较:

if fetchedObject.identifier == coreDataObject.identifier {
    //you already have the object 
} else {
    //you don't
}

虽然这听起来很简单,但在我使用 REST API 完成的所有项目中,这些 Identifier 属性都对我有用,而且你的情况似乎相同。

希望对你有帮助

【讨论】:

  • 其实fromJson函数就是这么做的。我遇到的问题是如何识别需要删除的对象。
  • 你能解决这个问题吗?我将做类似的事情,我很想知道最佳实践。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多