【问题标题】:Realm for Android: Store a non-RealmObject inside a RealmObject oneRealm for Android:将非 RealmObject 存储在 RealmObject 中
【发布时间】:2016-02-24 14:53:27
【问题描述】:

直接看代码。我们有两个类:

class Rocket extends RealmObject
{
 @PrimaryKey
 private long id;
 private String name;
 private Payload pl;
}

class Payload
{
 private String name;
 private double mass;
}

如何在 Realm 中存储 Rocket?

  1. 我可以手动将 Payload 序列化为某种字符串,然后将其与 Rocket 一起保存。但速度很慢。
  2. 我可以从 RealmObject 扩展 Payload 并将其保存到表中。但如果我这样做,我应该在每次删除父 Rocket 时删除 Payload。这绝对不是一个选择,因为模型变得非常混乱和复杂。

如果需要,我可以实现 Serializable 或 Parcelable 接口,但我确实需要将对象保存到 Realm 中。

谢谢。

【问题讨论】:

    标签: java android realm


    【解决方案1】:

    看起来您对显而易见的解决方案(扩展 RealmObject)的主要担忧是,当您删除父 Rocket 时,您想删除 Payload。不幸的是,级联删除了are not yet supported。您的选择是:

    • 序列化为字符串(注意这必须在Rocket对象之外完成)
    • 使Payload 扩展RealmObject 并为其赋予与Rocket 对象相同的主键,然后同时删除它们(通过相同的键)

    我推荐第二种解决方案,以及类似以下的方法:

    private void deleteRocket(long id) {
        realm.where(Rocket.class).equalTo("id", id).findFirst().removeFromRealm();
        realm.where(Payload.class).equalTo("id", id).findFirst().removeFromRealm();
    }
    

    【讨论】:

    • 感谢您的回复。我不需要级联删除亲戚。我只需要在该 db 对象中存储一个结构(具有几个成员变量的类)。如果需要,我可以实现 Serializable 接口。级联删除是通过存储自定义 RealmObjects 来实现类似功能的几个选项之一。但是应该有一种更简单的方法来实现这一点。我对TBH感到失望。但它仍然是一个不错的数据库。 (标记为已接受,因为我认为没有更简单的方法可以做我想做的事。)
    • 啊,我明白了。如果您check out this answer I left earlier, and the comment from Christian Melchior,您会看到自定义 getter/setter(即setPayload(Payload p),其中私有成员是String)当前不受支持,将在 0.88 中推出。所以你可以在那里实现你的序列化/反序列化逻辑,一旦 0.88 发布(我相信现在有一个 beta 快照可用)。
    • 具有自定义设置器/获取器支持的测试版快照目前不可用(2016 年 2 月 5 日凌晨 1:15 UTC)。但它很快就会到来。查看github.com/realm/realm-java/pull/2196的状态
    • 谢谢@beeender!我看到那里有is a 0.88-SNAPSHOT available,所以我(错误地)假设这个更改包含在其中。不过我会留意那个 PR :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 2017-03-29
    相关资源
    最近更新 更多