0

車とエンジンなど、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

4

2 に答える 2

1

現在、双方向の 1 対 1 マッピングはサポートされていないようです。

データベースに冗長なデータを入れたくないので (不整合を避けるため)、今のところ単純な 1 対 1 のマッピングで作業することにしました。この決定のもう 1 つの理由は、スタック オーバーフローなどを引き起こすリング依存関係があるかどうかわからないことです。

于 2013-10-09T07:18:13.920 に答える
0

関係を保持するために、車とエンジンのテーブルを提案します。

+------------------------------------+
|CAR                                 |
+------------------------------------+
|id_car     INTEGER,PK,AUTOINCREMENT |
+------------------------------------+

+------------------------------------+
|ENGINE                              |
+------------------------------------+
|id_engine  INTEGER,PK,AUTOINCREMENT |
+------------------------------------+

+------------------------------------+
|CARENGINE                           |
+------------------------------------+
|id_car     INTEGER,FK               |
|id_engine  INTEGER,FK               |
+------------------------------------+

CARENGINE は複合キーを使用します。greenDAO の経験がないため、複合キーをサポートしているかどうかわかりません (サポートしていない場合は CARENGINE に PK を追加してください)。

于 2013-09-30T08:49:44.917 に答える