0

我有一个名为 User 的自定义对象,它是一个 RealmObject。这个对象也有 Moshi 的注释,因为我计划在改造调用中使用这个对象。

public class User extends RealmObject
{
    @PrimaryKey private long id;
    @Json(name = "email") private String email;
    @Json(name = "first_name") private String firstName;
    @Json(name = "last_name") private String lastName;
    @Json(name = "password_hash") private String passwordHash;
    @Json(name = "avatar") private String avatar;
    @Json(name = "phone_number") private String phoneNumber;
    @Json(name = "country") private String country;
    @Json(name = "city") private String city;
    @Json(name = "address") private String address;
    @Json(name = "location") private Location location;
    @Json(name = "zip") private String zip;
    @Json(name = "device_meta") private DeviceMeta deviceMeta;
}

当我为这样的用户查询我的 Realm DB 时:

User user = getRealm().where(User.class).findFirst();

我得到这个响应(使用调试):

领域对象

可以看出,对象未初始化,但值显示在第一行。

这里有什么问题?

当我将上述对象作为@Body 参数传递时,它似乎是空的。

我还通过 Fiddler 进行了检查,发送到服务器的请求包含一个空对象。

问题:如何让这个对象获得正确的值?

4

2 回答 2

2

假设您正确保存和查询,它可能具有正确的值。Realm 创建每个扩展的子类版本RealmObject作为“RealmProxy”对象,有时在调试器中它看起来不像您期望的那样。您会注意到您的类实际上显示为UserRealmProxy(但它的内联值在 User = ... 之后不为空)。

要查看非领域代理版本,您必须使用Realm.copyFromRealm(...).

另外,请注意,从网络解析的任何内容都不会自动添加到领域——在这种情况下,您必须显式复制到领域才能在以后的查询中获取值,因为从网络解析的内容最初是不受管理的。

于 2018-01-31T20:20:11.203 回答
2

请重新考虑这个设计。

对本地持久性和网络使用相同的类型可以节省一些样板代码。随着您的应用程序变得越来越复杂,这种方法可能会变得非常脆弱。

创建一个基本的值对象、UserJson 和一个 JSON 适配器以在它们之间进行映射并不需要太多代码。使用 Moshi 的 @ToJson/@FromJson 方法,它也非常简单,甚至可测试。这将在未来为您提供很大的灵活性。

于 2018-02-01T04:06:13.667 回答