我有一个基类Peripheral
。类Sensor
和Master
是Peripheral
的扩展。我需要ORMlite来实例化以前保存的外围对象。显然,任何反复实例化Peripheral
的尝试都会因其抽象性而导致ClassInstantiationException
。我怎样才能让ORMlite加载任何Peripheral
对象,因为Peripheral
是抽象的?
以下是我正在做的事情的样本:
@DatabaseTable(tableName="Peripheral")
abstract class Peripheral {
@DatabaseField(generatedId="true")
int _ID;
@DatabaseField
int mSerial;
}
class Sensor extends Peripheral {
}
class Master extends Peripheral {
}
答案 0 :(得分:3)
如果外围设备是抽象的,我怎么能让ORMlite加载任何Peripheral对象?
我认为您的问题源于@DatabaseTable
需要Sensor
和Master
类。也不会在基类上伤害它,但在那里不会被检测到。
这将有一个名为"Peripheral"
的表用于两个超类。将检测基类中的任何字段(例如mSerial
)并将其用作两个超类中的字段。
唯一的限制是ORMLite无法区分Sensor
和Master
。它现在缺少允许您获取Sensor
的所有行并获取Master
的所有行的功能。此外,如果超类具有标记为@DatabaseField
的自己的字段,则无法为它们生成架构。
编辑:
重申ORMlite(截至2013年3月)不支持同一表中的多个子类,这一点很重要。子类将从基类继承数据库字段,但它们必须都在自己的表中。这是邮件列表中的discussion about this topic。
要实现此目的,您可以拥有3个表:1表示基类信息,2表示子类。子类表将具有相关基类行的外键。
答案 1 :(得分:0)
格雷是正确的,当我第一次问这个问题时,我忘记了那个反思规则。我已经解决了反射限制的局限性和ORMlite目前在超级类之间没有兴趣。这是我的结构:
class Peripheral {
@DatabaseField(generatedId)
int _ID;
@databaseField
int serial;
// ... Methods ommitted to be succint
}
class PeripheralWrapper extends Peripheral {
final Peripheral mBase;
PeripheralWrapper(Peripheral peripheral) {
mBase = peripheral;
}
// ... Methods are overridden but call the base's methods instead
}
class Sensor extends PeripheralWrapper {
Sensor(Peripheral peripheral) {
super(peripheral);
}
}
class Master extends PeripheralWrapper {
Master(Peripheral peripheral) {
super(peripheral);
}
}
// This is the work around
@DatabaseTable(tableName="Peripheral")
class BasePeripheral extends Peripheral {
}
这项工作实际上很简单。现在我只是给basePeripheral充气,然后根据需要将它们传递给包装器。包装的所有通货膨胀和委托都是在PeripheralFactory中完成的。