如果在API响应中删除了Realm Object条目,则删除它

时间:2017-04-30 18:30:04

标签: ios swift realm

第一个回应是我得到两个用户,即abc@gmail.com& xyz@gmail.com

[{
       "email": "abc@gmail.com",
       "type": "primary_email",
       "linked_to": {
         "_id": "DAS44564dasdDASd",
         "image": null,
         "company": null,
         "designation": null,
         "name": null
       },
       "active_platforms": [
         "asd",
         "qwe"
       ]
     },
{
       "email": "xyz@gmail.com",
       "type": "primary_email",
       "linked_to": {
         "_id": "DAS44564dasdDASd",
         "image": null,
         "company": null,
         "designation": null,
         "name": null
       },
       "active_platforms": [
         "asd",
         "qwe"
       ]
     }]

现在如果我再次进行API调用就删除了abc@gmail.com,那么我仍然会在我的对象中获得abc@gmail.com,因为它没有从我的域中删除。那么如何处理这种情况?

        // write request result to realm database
        let entries = json["data"]
        realm.beginWrite()
        for (_, subJson) : (String, JSON) in entries {
            let entry: AppUsers = Mapper<AppUsers>().map(JSONObject: subJson.dictionaryObject!)!
            realm.add(entry, update: true)
        }

        do {
            try realm.commitWrite()
        } catch {

        }

2 个答案:

答案 0 :(得分:1)

更新您的逻辑如下。这是其中一种方法。

向AppUsers模型添加一个额外的bool字段,说'active'。更新您的代码如下

  // write request result to realm database
    let entries = json["data"]
    realm.beginWrite()

   //Fetch all realm AppUsers objects
   let allAppUsers = //TODO fetch all AppUsers objects here
   for user in allAppUsers {
        user.active = false
   }

    for (_, subJson) : (String, JSON) in entries {
        let entry: AppUsers = Mapper<AppUsers>().map(JSONObject: subJson.dictionaryObject!)!
        entry.active = true
        realm.add(entry, update: true)
    }

        for user in allAppUsers {
            if !user.active {
                realm.delete(user)
            }
        }


    do {
        try realm.commitWrite()
    } catch {

    }

答案 1 :(得分:1)

这听起来像是一个问题,即Realm数据库中的数据已经过时,因为内容不再与服务器上的内容相匹配。

Realm API realm.add(_, update: true)将更新传递给它的任何对象,但只是不传递对象并不意味着它应该被删除(更多,你只是不想更新它)。

Realm无法自动知道是否需要删除对象。你自己需要掌握这种逻辑。

由于检查对象是否被删除的机制是通过其电子邮件地址,因此您可以捕获已更新的每个对象的电子邮件地址,然后删除其电子邮件地址不在其中的任何其他对象。 / p>

// write request result to realm database
realm.beginWrite()

let entries = json["data"]
var updatedEmails = [String]()

for (_, subJson) : (String, JSON) in entries {
    let entry: AppUsers = Mapper<AppUsers>().map(JSONObject: subJson.dictionaryObject!)!
    // Save the email we just processed
    updatedEmails.append(entry.email)
    realm.add(entry, update: true)
}

// Delete all objects not in the updated emails list
let realmEntries = realm.objects(AppUsers.self)
for entry in realmEntries {
    if !updatedEmails.contains(entry.email) {
        realm.delete(entry)
    }
}

do {
    try realm.commitWrite()
} catch {

}

如果您的REST API每次都以完整的形式关闭所有对象,那么更快的解决方案也是每次只清空Realm文件,并且每次只是将对象添加为新对象。