Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有Gson子更新错误的域_Java_Android_Realm - Fatal编程技术网

Java 具有Gson子更新错误的域

Java 具有Gson子更新错误的域,java,android,realm,Java,Android,Realm,我有一个具有以下结构的用户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, "per

我有一个具有以下结构的用户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更新权限子对象?

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将尝试更新它。如果您确定每个
权限属于单个
用户
,则可以在更新
用户
之前将其删除

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);
    }
  });

因此,
User
Permissions
类都需要一个带注释的
@PrimaryKey
字段在权限中的示例json中,我无法从json创建主键,有一种方法可以做到这一点,无需任何json修改?
User.getPermissions().setId(User.getId())
这很好,但是,User=gson.fromJson(json,User.class);不再有效,但我将使用此方法,谢谢!