具有Gson序列化的RealmObjects的继承构成

时间:2017-02-15 20:48:06

标签: java android gson realm

由于种种原因,我认为Realm是一个数据库解决方案,但是现在正在被Nougat抛出的TransactionTooLargeException中的一个很大,所以我必须重新修改我当前的数据库架构,基于ActiveAndroid,它具有它本身很烦人的局限。困难在于Realm不支持继承(https://github.com/realm/realm-java/issues/761)并且他们似乎并不急于解决它。相反,他们建议使用组合而不是继承,但我无法弄清楚如何使用Gson / Json反序列化。

示例:

超类:动物,带有狗和德国牧羊犬的子类

public class Animal {

    private int numLegs;

    private boolean hasFur;
}

public class Dog extends Animal {
    private String color;

    private boolean canDoTricks;
}

public class GermanShepherd extends Dog {

    public boolean isGuardDog;

    public boolean isAtRiskOfHipDysplasia()
}

(对不起,这是一个超级固定的例子,只是为了说明)。

现在让我们说这个json看起来像:

{
  "numLegs" : 4,
  "hasFur" : true,
  "color" : "Black & Brown",
  "canDoTricks" : true,
  "isGuardDog" : true,
  "isAtRiskofHipDysplasia" : false
}

现在,我无法修改Json,因为它是一个提供给我的API。

看看这个答案:https://stackoverflow.com/a/41552457/4560689,似乎有可能以一种非常黑客的方式使其成为一种工作,但答案指出,存在一些限制,包括序列化是错误的。由于服务器只以json格式进行会话,并不涉及疯狂的构图,因此存在问题。

我可以编写自定义Gson反序列化器/序列化器来使其工作吗?如果是这样,那会是什么样子?我基本上需要能够将json有效负载转换为 N 对象,其中 N - 1 对象嵌套在基础对象中。

所以有了构图(注意这不是必须" Realm"构图,只是一个例子,因为看起来Realm必须使用一些奇怪的界面组合形式),我' d有如下课程:

public class GermanShepherd {
    public Animal animal;
    public Dog dog;

   // Generate a bunch of delegate methods here
}
我是在叫错树吗?感觉Realm可能不适用于我想要做的事情,并且继承内置于我在多个地方使用的API中,特别是在我想要保留的对象中,所以我必须要么找出解决方法或使用其他解决方案。 ActiveAndroid(我现在正在使用它)也是一个不太理想的解决方案,而且我在处理围绕死锁,崩溃,查询后台线程时会生病,如果数据太大,现在会导致崩溃传入Intent等... SQLite的所有问题。我对我的主要问题的解决方案或解决这个问题的替代方案持开放态度。在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

您应该为每个拼合的具体类创建一个新的RealmObject类,并将JSON表示映射到它们。

要保留继承,可以通过从彼此继承的接口继承getter / setter来模拟它。

after

因为那样你可以做到

 $scholars = (new Scholar)->newQuery()->select('*')->get();

您甚至可以从中创建存储库类

foreach($scholars as $scholar){
 $lt = $scholars->lat;
 dd($lt);
}

然后

linebreaks

但是你确实可以将它们合并到一个类中,然后给它一个linebreaksbr参数来知道它最初的类型。这可能比拥有所有这些GermanShepards更好。