领域与Gson儿童更新错误

时间:2017-06-12 21:05:59

标签: java android realm

我有一个具有以下结构的用户Json,我使用Gson和Realm来保存它。

public void displayTable(){
    System.out.print("    1   2   3   4   5   6   7   8   9  10" +
        "\n  ----------------------------------------");
    for(int factorNumberDown = 1; factorNumberDown < 11; factorNumberDown++)
    {   
        System.out.printf("\n%1s%s", factorNumberDown, "| ");
        for(int factorNumberAcross = 1; factorNumberAcross <11; factorNumberAcross++)
        {  
           System.out.printf("%4s", factorNumberDown*factorNumberAcross + " ");
        }
    }
}

我的用户对象是:

{
    "id": 2204,// this id is unique
    "name": "Test Name",
    "session_token": "someexmapletoken",
    "account_id": 1,
    "account_name": "S",
    "permissions": {
        "permision_one": true,
        "permision_two": true,
        "permision_tree": false

    }
}

每次更改某些权限时,我都会向用户json发出新请求,因此我调用此代码:

public class User extends RealmObject {

 @SerializedName("id")
 @Expose
 @PrimaryKey
 private Integer id;
 @SerializedName("name")
 @Expose
 private String name;
 @SerializedName("session_token")
 @Expose
 private String sessionToken;
 @SerializedName("account_id")
 @Expose
 private Integer accountId;
 @SerializedName("account_name")
 @Expose
 private String accountName;
 @SerializedName("permissions")
 @Expose
 private Permissions permissions;
 //omitted getters and setters
}

public class Permissions extends RealmObject{

 @SerializedName("permision_one")
 @Expose
 private Boolean permisionOne;
 @SerializedName("permision_two")
 @Expose
 private Boolean permisionTwo;
 @SerializedName("permision_tree")
 @Expose
 private Boolean permisionTree;
 //omitted getters and setters
}

如果用户ID保持不变,则更新相同的域用户,但每次调用此代码时,都会创建一个新的Permission对象。还有一种方法可以使用Gson更新Permission子对象吗?

2 个答案:

答案 0 :(得分:0)

Realm Just Check the PrimaryKey以查看对象是否存在, 在插入对象之前 首先为您的对象设置PrimaryKey

Permissions item = realm.where(Permissions.class).equalTo("permisionOne", permisionOne).equalTo("permisionTwo", permisionTwo).equalTo("permisionThree", permisionThree).findFirst();
if(item != null)
user.getPermissions().setId(item.id)

然后尝试你的代码。如果id存在,Realm会尝试更新它

答案 1 :(得分:0)

如果您确定每个Permissions属于单User,则可以在更新User之前将其删除。

Gson gson = new Gson();
User user = gson.fromJson(json, User.class);
  realm = Realm.getDefaultInstance();

  realm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
      User existingUser = realm.where(User.class).equalTo("id", user.gtId()).findFirst();
      if (existingUser != null) {
          existingUser.getPermisions().deleteFromRealm();
      }

      realm.insertOrUpdate(user);
    }
  });