車とエンジンなど、2 つのエンティティがあります。
各車には 1 つのエンジンが搭載されていますが (少なくともこのモデルでは :) )、すべてのエンジンが車に組み込まれているわけではありません。したがって、次のテーブル構造が必要です。
+------------------------------------+
|CAR |
+------------------------------------+
|id_car INTEGER,PK,AUTOINCREMENT |
|id_engine INTEGER,FK |
+------------------------------------+
+------------------------------------+
|ENGINE |
+------------------------------------+
|id_engine INTEGER,PK,AUTOINCREMENT |
+------------------------------------+
(もちろん、もっと多くの列があります。実際には、それぞれ約 15 列のエンティティが 2 つあります。しかし、単純にしておきましょう。)
これは次のようにモデル化できます。
engine = schema.addEntity("Engine");
Property pkEngine = engine.addLongProperty("id_engine").primaryKey().autoincrement().getProperty();
car = schema.addEntity("Car");
car.addLongProperty("id_car").primaryKey().autoincrement();
Property fkEngine = car.addLongProperty("id_engine").getProperty();
car.addToOne(engine, fkEngine);
しかし、対応するエンティティオブジェクトのゲッターを使用して、エンジンから車と車からエンジンを照会できるようにしたいと考えています。したがって、私は追加しました:
engine.addToOneWithoutProperty("Car", car, "id_car");
次に、必要なすべてのゲッターを取得しますが、テーブルは次のようになります。
+------------------------------------+
|CAR |
+------------------------------------+
|id_car INTEGER,PK,AUTOINCREMENT |
|id_engine INTEGER,FK |
+------------------------------------+
+------------------------------------+
|ENGINE |
+------------------------------------+
|id_engine INTEGER,PK,AUTOINCREMENT |
|id_car INTEGER |
+------------------------------------+
挿入に次のステートメントを使用すると、 fk-columns が矛盾しCAR.id_engine is NULL
ているため、 getter を使用して例外が発生しengine.getCar()
ます。
Engine engine = new Engine();
mEngineDao.insert(engine);
Car car = new Car();
car.setEngine(engine);
engine.setCar(car);
mCarDao.insert(car);
engine.update();
greendao を使用して One2One-Relation を構築し、各エンティティに外部キー列とゲッターが 1 つだけ存在するようにする方法を提案する人はいますか?
- -アップデート - -
addToOneWithoutProperty() が正しく動作しないようです。void bindValues(SQLiteStatement stmt, Car entity)
列を気にする生成されたセクションが見つかりませんid_engine
。