【问题标题】:Realm with Gson Child Update Error具有 Gson 子更新错误的领域
【发布时间】:2017-06-12 21:05:59
【问题描述】:

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

{
    "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

    }
}

我的用户对象是:

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
}

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

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) {
      realm.insertOrUpdate(User);
    }
  });

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

【问题讨论】:

  • 为此,UserPermissions 类都需要 @PrimaryKey 注释字段
  • 在我的示例 json 的情况下,我无法从 json 创建主键,有没有办法做到这一点,无需任何 json 修改?
  • user.getPermissions().setId(user.getId())
  • 这工作正常但是,用户用户 = gson.fromJson(json, User.class);不再有效,但我会这样做,谢谢!

标签: java android realm


【解决方案1】:

Realm 只是检查 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 会尝试更新它

【讨论】:

    【解决方案2】:

    如果您确定每个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);
        }
      });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 2012-03-10
      • 1970-01-01
      相关资源
      最近更新 更多