如何使用greendao建模双向One2One关系?

时间:2013-09-30 07:33:00

标签: android greendao

我有2个实体,例如汽车和引擎。

每辆车都有一个发动机(至少在这个型号:)),但不是每个发动机都内置在汽车中。所以我想要以下表格结构:

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

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

(当然还有更多的列。实际上我有两个实体,每个实体大约有15列。但是让我们保持简单。)

这可以这样建模:

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);

但我希望能够从汽车的引擎和引擎查询汽车,并在相应的实体对象上使用getter。 因此我补充道:

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,以便每个实体中只有一个外键列和getter?

--- --- UPDATE

似乎addToOneWithoutProperty()无法正常工作。我在生成的void bindValues(SQLiteStatement stmt, Car entity)中找不到关注列id_engine的部分。

2 个答案:

答案 0 :(得分:1)

目前似乎不支持双向一对一映射。

由于我不想在我的数据库中使用冗余数据(为了避免不一致),我现在决定使用简单的一对一映射。这个决定的另一个原因是我不知道是否会有环依赖导致堆栈溢出或其他事情。

答案 1 :(得分:0)

我建议用一个汽车引擎表来保持这种关系:

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

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

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

CARENGINE使用复合键,没有greenDA的经验,因此不知道它是否支持复合键(如果没有,则加入PK到CARENGINE)。