【问题标题】:ActiveAndroid abstract class tableActiveAndroid抽象类表
【发布时间】:2015-09-17 03:32:06
【问题描述】:

有谁知道是否可以在 ActiveAndroid 中为抽象类创建表。例如,我可以有一个抽象类 Animal 和两个具体类 Dog 和 Cat。我希望能够做类似的事情:

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

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

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

其中“动物”可以是猫或狗。 不幸的是,当我这样做时,我得到了一个异常,因为没有为抽象类 Animal 创建表。 有谁知道我如何使用 ActiveAndroid 来解决这个问题?

【问题讨论】:

  • 不能用基类代替抽象吗?
  • 我不太确定我明白你为什么要这样做? Abstract 类的全部目的是让您必须使用子类,例如CatDog。请注意您是如何创建 Animal animal 对象的,这无法在 Java 中完成,但是您可以事先完成列表,尽管在使用该对象之前您必须转换为适当的子类。
  • 我不会在上面的示例中创建抽象的“动物”。我希望 ActiveAndroid 根据最初保存对象的类型来构造 Cat 或 Dog。

标签: java android sqlite orm activeandroid


【解决方案1】:

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

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

  • 创建某种注释,允许您将模型 (Animals) 定义为非持久化的东西(请参阅 com.activeandroid.annotation.Table)。
  • 在尝试对该类执行查询时,您可以使用反射来确定其子类,然后让它对每个子类执行该查询。
  • 然后,您基本上会获取每个查询的结果列表,并将它们组合成一个列表并返回。

老实说,我从未在任何 Android ORM 库中看到过继承,而且我个人认为这不是一个好的模型设计模式。您可能需要重新考虑走这条路的理由。

【讨论】:

  • 在持久化我的模型类时,您会推荐什么而不是继承?我希望能够保存可能是不同类型的“工作”的“工作”。我最好是为每种作业类型创建一个单独的表,然后是一个“主”表,该表存储作业类型和该作业类型的正确表的外键?
  • @user3265561 我要做的是以非常通用的方式创建工作模型。这些列将是 JobType 以及所有作业共有的任何其他属性。它还有一个 AdditionalProperties 列,它是一个字符串,其中包含任何其他作业特定属性的序列化 JSONObject。
  • 这样我就可以有一个通用的“Job”保存到数据库中,然后每个子类“RealJob”可以覆盖一个“serializeAdditionalProperties()”函数,该函数将返回所需的 json将来反序列化时重建该对象。
  • @user3265561这可行!只要您确保 RealJob 没有自己的表格。虽然我个人可能只保留一个通用 Job 类并在其中使用一堆实例方法来根据它的类型做不同的事情
猜你喜欢
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多