1

我有一个基类Peripheral。类SensorMasterPeripheral. 我需要 ORMlite 来实例化我之前保存的外围对象。显然,由于其抽象性,任何反射实例化的尝试Peripheral都会导致 a 。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 {
}
4

2 回答 2

3

由于 Peripheral 是抽象的,我如何让 ORMlite 加载任何 Peripheral 对象?

我认为您的问题源于@DatabaseTable需要在SensorMaster类上的事实。在基类上也不会伤害它,但在那里不会被检测到。

这将有一个名为"Peripheral"用于两个超类的表。基类中的任何字段(例如mSerial)都将被检测并用作两个超类中的字段。

唯一的限制是 ORMLite 无法区分SensorMaster。它现在缺少允许您获取所有行 aSensor并获取所有行 a 的功能Master。此外,如果超类有自己的字段标记为 ,它不能为它们生成模式@DatabaseField

编辑:

重申ORMlite(截至 2013 年 3 月)不支持同一张表中的多个子类很重要。子类将从基类继承数据库字段,但它们必须各自位于自己的表中。这是邮件列表上有关此主题的讨论。

为此,您可以有 3 个表:1 个用于基类信息,2 个用于子类。子类表将具有关联的基类行的外键。

于 2012-07-19T21:44:13.840 回答
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 中完成。

于 2012-07-19T22:37:04.223 回答