你如何使用ORMLite与抽象类?

时间:2012-07-19 21:39:59

标签: android ormlite

我有一个基类Peripheral。类SensorMasterPeripheral的扩展。我需要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 {
}

2 个答案:

答案 0 :(得分:3)

  

如果外围设备是抽象的,我怎么能让ORMlite加载任何Peripheral对象?

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

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

唯一的限制是ORMLite无法区分SensorMaster。它现在缺少允许您获取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中完成的。