Ale*_*ndr 6 android json realm
我有json场_id
String json = "{ _id : 1, name : 'Alex', role: 'admin' }"
Run Code Online (Sandbox Code Playgroud)
在我的Realm模型中,我使用@SerializedName属性:
public class User extends RealmObject {
@SerializedName("_id")
@PrimaryKey
private int id;
private String name;
private String comment;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
}
Run Code Online (Sandbox Code Playgroud)
如果尝试保存json:
realm.createOrUpdateObjectFromJson(User.class, json)
字段_id无法解析,并在数据库中创建id = 0的记录
在使用@SerializedName属性的文档中
Gson gson = new GsonBuilder()
.setExclusionStrategies(new ExclusionStrategy() {
@Override
public boolean shouldSkipField(FieldAttributes f) {
return f.getDeclaringClass().equals(RealmObject.class);
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
}).create();
User user = gson.fromJson(json, User.class);
realm.beginTransaction();
realm.copyToRealmOrUpdate(user);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,json = "{ _id : 1, role: 'user' }"只需name从数据库中删除用户,因为String的默认值为null.
所以,我可能错误地使用了该属性.在处理json(createOrUpdateObjectFromJson等)的守恒方法时如何考虑属性?
Ani*_*oin 13
为什么要编写所有这些自定义序列化程序,以便让Gson和 Realm只与一行代码一起工作?
IMO,为我们想要序列化的每个模型设置独家策略并不是最好的方法.正如你已经意识到的那样,这种方法需要编写很多易于出错的锅炉板代码,而最糟糕的是,它会杀死Gson的内容(这会让我们的生活变得更加痛苦).
由于我们正在解决不兼容问题,为什么不确保将无人管理的RealmObject 传递给Gson序列化程序?
在这里找到.获取托管RealmObject的内存副本并将其传递给Gson
new Gson().toJson(realm.copyFromRealm(managedModel));
Run Code Online (Sandbox Code Playgroud)
就是这样!没有更多的代码可写!
其他好的解决方案和解释在这里发布.
您可能需要一个混合解决方案才能完成这项工作。原因是这@SerializedName是一个 GSON 注释,而不是 Realm 知道的注释。所以这意味着您有两个选择,正如您已经发现的:
1)使用GSON,这意味着最终结果是一个null默认为 的对象name。
2) 使用createOrUpdateObjectFromJson这意味着_id将被忽略,因为 Realm 的 JSON 解析器需要 1:1 映射。
由于这两种解决方案都无法正常工作,您可以通过以下方式修改它们:
copyToRealmOrUpdate1) 使用 GSON,您可以手动搜索对象并更新角色,而不是这样做:
realm.beginTransaction();
realm.where(User.class).equalTo("id", user.getId()).findFirst().setRole(user.getRole());
realm.commitTransaction();
Run Code Online (Sandbox Code Playgroud)
2) 仅使用纯 JSON,您可以修改以匹配预期格式:
JSONObject obj = new JSONObject(json);
obj.put("id", obj.getString("_id"));
obj.remove("_id");
Run Code Online (Sandbox Code Playgroud)
Realm 在跟踪自定义映射请求时存在问题,但它的优先级较低,因为 GSON、Jacokson 等框架通常可以更好地涵盖该功能:https: //github.com/realm/realm-java/issues /1470
| 归档时间: |
|
| 查看次数: |
3341 次 |
| 最近记录: |