服务器端更改的 Restkit.Delete

Posted

技术标签:

【中文标题】服务器端更改的 Restkit.Delete【英文标题】:Restkit.Delete on server sided changes 【发布时间】:2012-09-04 20:53:23 【问题描述】:

我使用 RestKit 从我的网络服务器接收数据并将其存储在 Core Data 中。

一切正常,对象映射也是如此。

但现在我有一个问题/问题。 我想将我的设备与来自网络服务器的数据同步。 新对象或更新对象的方式很清楚,因为 RestKit 为我控制它。但是如何删除 Core Data 中的对象呢?有一种使用DELETE 方法的方法。但是,如果某些对象在服务器上被删除了呢?

我想使用上次同步的时间戳发出 GET 请求,以接收所有数据更改(增量)。

新对象(正常) 修改对象(OK) 已删除对象(如何?)

如何使用 JSON 负载从服务器中删除 Core Data 中的对象。 设置 JSON 中对象的删除属性时,是否有可能阻止保存?有没有办法从 Core Data 中删除这个对象。

【问题讨论】:

【参考方案1】:

这对我有用。我正在使用 RestKit 0.10.2

#pragma Mark - RKObjectLoaderDelegate
- (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects 

    //Select all users in Core Data
    NSArray* allUsers = [User findAll]; 

    for (User *userRecord in allUsers)  

        // check each user into objects loaded now. If not contains, delete him
        if (NO == [objects containsObject:userRecord]) 

                [[[[RKObjectManager sharedManager] objectStore] managedObjectContextForCurrentThread] deleteObject:userRecord];
        
      

     //Saving changes in MOC
     NSError* error = nil; 
     [[[[RKObjectManager sharedManager] objectStore] managedObjectContextForCurrentThread] save:&error]; 

     if (nil != error)  
        NSLog(@"################# Error %@", error);
     


【讨论】:

【参考方案2】:

解决方案 n°1:removed 属性

恕我直言,删除所有未出现在请求响应中的本地对象并不是一个好的解决方案。所以我只添加一个属性removed(不是deleted,因为它是Core Data 保留的)并且只显示Object[removed=FALSE]

在获取请求中,它将是:

removed == FALSE

解决方案 n°2:我应该删除什么?

您可以在您的 API 中创建一个简单的页面来指示您的应用程序中要删除的内容。例如:

[
  'type': 'post', 'id': 5,
  'type': 'comment', 'id': 10,
]

然后,您将通过postIDcommentID 获取对象并将它们从存储中删除。您必须找到一种方法向服务器确认删除,因为列表会增加。

【讨论】:

以上是关于服务器端更改的 Restkit.Delete的主要内容,如果未能解决你的问题,请参考以下文章

识别服务器端客户端浏览器中的内容更改

如何更改 Apache Tomcat Web 服务器端口号 [关闭]

由于服务器端数据更改,我们不需要停止运行项目

GWT RequestFactory 并将服务器端更改传播到客户端

怎么修改Xampp中Apache服务器的端口号

我需要更改网页的内容而不刷新服务器端发生更改的位置