代码之家  ›  专栏  ›  技术社区  ›  Asim

如何与Moshi一起使用RealmObject

  •  0
  • Asim  · 技术社区  · 8 年前

    我有一个名为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;
    }
    

    当我为这样的用户查询我的领域数据库时:

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

    我得到以下响应(使用调试):

    Realm Object

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

    这里的问题是什么?

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

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

    问题:如何使此对象获得正确的值?

    2 回复  |  直到 8 年前
        1
  •  2
  •   Submersed    8 年前

    如果您正确保存和查询,它可能具有正确的值。Realm创建每个扩展 RealmObject 作为“RealmProxy”对象,有时在调试器中,它看起来不像您所期望的那样。你会注意到你的班级实际上表现为 UserRealmProxy (但它的内联值在User=…之后不为null)。

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

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

        2
  •  2
  •   Jesse Wilson    8 年前

    请重新考虑这个设计。

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

    创建一个基本的值对象UserJson和一个JSON适配器来进行映射并不是很多代码。使用Moshis@ToJson/@FromJson方法也很容易,甚至可以测试。这将在将来为您提供很大的灵活性。