ActiveAndroid抽象类表

17

有人知道在ActiveAndroid中是否可以为抽象类创建表格吗?例如,我可以有一个名为Animal的抽象类,它有两个具体的类Dog和Cat。我想要做的就是:

List<Animal> animals = new Select().from(Animals.class).execute();

这将导致“animals”包含所有已保存的猫和狗。 或:

Animal animal = new Select().from(Animals.class).where("name = ?", name).executeSingle();

“动物”可以是猫或狗。 但不幸的是,当我尝试这样做时,出现了异常,因为没有为抽象类“动物”创建表格。 有人知道我如何使用ActiveAndroid解决这个问题吗?


1
你能不能使用基类来代替抽象类? - Tuxxy_Thang
我不太确定我理解为什么你想要这样做?抽象类的整个目的是让你使用子类,比如CatDog。请注意,你正在创建一个无法在Java中完成的Animal animal对象,但是你之前的列表可以完成,尽管在使用对象之前必须转换为适当的子类。 - Brandon Ragland
在上面的例子中,我不会创建一个抽象的“动物”。当对象最初保存时,我希望ActiveAndroid根据对象的类型构建猫或狗。 - user3265561
1个回答

1

不幸的是,ActiveAndroid目前还不支持模型的继承方式(https://github.com/pardom/ActiveAndroid/issues/14, https://github.com/pardom/ActiveAndroid/issues/257)。

如果你想修改ActiveAndroid,可以这样做:

  • 创建某种注释,允许你将一个模型(Animals)定义为不需要持久化的内容(参考com.activeandroid.annotation.Table)。
  • 在尝试执行该类的查询时,你可以使用反射来确定其子类,然后让它执行每个子类的查询。
  • 然后,你基本上会将每个查询的结果列表合并成一个列表,并返回。

老实说,我从未见过任何 Android ORM 库中有继承,而且我个人认为这不是一种好的模型设计模式。你可能需要重新考虑你选择这条路的原因。


当持久化我的模型类时,除了继承,你会有什么建议?我想能够保存各种不同类型的“作业”。是否最好为每种工作类型分别创建一个表,然后一个“主”表来存储作业类型和该作业类型所属的正确表的外键? - user3265561
1
@user3265561 我会以非常通用的方式创建工作模型。列将是JobType和所有工作共有的其他属性。它还将具有一个AdditionalProperties列,其中包含任何其他特定于工作的属性的序列化JSONObject的字符串。 - Nyx
这样,我可以拥有一个通用的“Job”,它将保存到数据库中,然后每个子类化的“RealJob”都可以覆盖“serializeAdditionalProperties()”函数,该函数将返回所需的JSON以在未来反序列化该对象时重建它。 - user3265561
@user3265561那应该可以!只要你确保RealJob没有自己的表格。不过个人而言,我可能会只保留一个通用的Job类,并在其中使用一堆实例方法来根据其类型执行不同的操作。 - Nyx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接