0

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

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

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

- -更新 - -

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

4

2 回答 2

1

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

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

于 2013-10-09T07:18:13.920 回答
0

我建议使用 car-engine 表来保持这种关系:

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

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

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

CARENGINE使用的是复合键,没有greenDAO的经验所以不知道是否支持复合键(如果不支持的话加个PK到CARENGINE)。

于 2013-09-30T08:49:44.917 回答