如何删除房间子表中的所有记录?

时间:2019-09-14 14:27:12

标签: android android-room

我想使用Firebase刷新本地数据库。

我有2个表,一个是具有ID,名称...的植物,另一个是具有一对一关系中的plantId的价格。

我认为,我可以将Firebase DB数据存储在Room db中,但是本地数据库不使用生成的ID,因此该ID与Firebase ID相同。

因此,当Firebase实时数据库中的工厂数据发生更改时,我从本地db中的工厂表中删除所有记录,然后插入新的工厂记录,但我想保留第二个(价格)表记录,其中包含工厂ID。 其实我的问题是:房间抛出异常,因为它无法删除工厂表。

我读了很多书,并且找到了一个提示,可以设置onDelete = NO_ACTION,但无济于事。

有人可以帮忙,我该如何解决这个问题?

如果我不向价格表中添加数据,则可以刷新Plant表

My PlantEntity

@Entity(tableName = "plants")
public class PlantEntity {

    @PrimaryKey
    private Long id;

    @ColumnInfo(name = "name")
    private String name;

    @ColumnInfo(name = "active")
    private boolean active;

My PriceEntity

@Entity(tableName = "prices",
        foreignKeys = {
                @ForeignKey(
                        entity = PlantEntity.class,
                        parentColumns = "id",
                        childColumns = "plant_id",
                        onDelete = NO_ACTION),
                @ForeignKey(
                        entity = AmountUnitEntity.class,
                        parentColumns = "id",
                        childColumns = "amount_unit_id",
                        onDelete = NO_ACTION)})
public class PriceEntity {

    @PrimaryKey(autoGenerate = true)
    private Long id;

    @ColumnInfo(name = "description")
    private String description;

    @ColumnInfo(name = "min_price")
    private int minPrice;

    @ColumnInfo(name = "max_price")
    private int maxPrice;

    @ColumnInfo(name = "plant_id")
    private Long plantId;

    @ColumnInfo(name = "amount_unit_id")
    private Long amountUnitId;

And my PlantDao

@Insert
    void insert(List<PlantEntity> plantEntityList);

    @Update
    void update(PlantEntity plantEntity);

    @Delete
    void delete(PlantEntity plantEntity);

    @Query("DELETE FROM plants")
    void deleteAll();

1 个答案:

答案 0 :(得分:1)

如果要保留已删除工厂的PriceEnity行,则无法定义工厂的ForeignKey,因为这是Foreignkey的约束冲突。

如果您不想保留PriceEntity,请使用onDelete = CASCADE,这将删除父级的子级。