1

基本クラスがありPeripheralます。クラスSensorMasterは の拡張ですPeripheral。以前に保存した 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 {
}
4

2 に答える 2

3

Peripheralは抽象であるため、ORMliteにPeripheralオブジェクトをロードさせるにはどうすればよいですか?

あなたの問題は、クラス@DatabaseTableにある必要があるという事実から生じたと思います。基本クラスでも問題はありませんが、そこでは検出されません。SensorMaster

"Peripheral"これには、両方のスーパークラスに使用されるという名前の1つのテーブルがあります。基本クラスのフィールド(などmSerial)はすべて検出され、両方のスーパークラスのフィールドとして使用されます。

Sensor唯一の制限は、ORMLiteがとを区別できないことMasterです。現在、であるすべての行を取得し、であるすべての行を取得できる機能がありませSensorMaster。また、スーパークラスに。でマークされた独自のフィールドがある場合、それらのスキーマを生成することはできません@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 に答える