使用Room更新方法更新自我引用外键失败

时间:2017-10-11 15:03:43

标签: android sqlite foreign-keys android-room

我需要使用房间创建文件夹结构。我遵循了这种方法。

@Entity(foreignKeys = @ForeignKey(entity = NodeEntity.class,
        parentColumns = "id",
        childColumns = "parentId", onDelete = CASCADE), indices = {@Index(value = {"parentId"})})
public class NodeEntity {
    @PrimaryKey
    @NonNull
    private String id;
    private int isLeafItem;
    private int level;
    private String name;
    private String parentId;
    private double price;
    private int quantity;
    private String tags;
    @TypeConverters(DateConverter.class)
    private Date createdAt;
}

我的节点DAO就是这样。

@Dao
public interface NodeDao {

    @Insert(onConflict = REPLACE)
    void createNode(NodeEntity nodeEntity);

    @Query("SELECT * FROM NodeEntity WHERE parentId = :parentId ")
    Flowable<List<NodeEntity>> getNodesByParentId(String parentId);

    @Query("SELECT * FROM NodeEntity WHERE level = :level")
    Flowable<List<NodeEntity>> getNodesByLevel(int level);

    @Query("SELECT * FROM NodeEntity WHERE id = :nodeId")
    Single<NodeEntity> getNode(String nodeId);

    @Update(onConflict = REPLACE)
    void updateNode(NodeEntity node);

    @Delete
    void deleteNode(NodeEntity nodeEntity);
}

所有操作都运行正常。但如果我尝试将一个文件夹移动到另一个文件夹,则意味着您需要更改要移动的文件夹的parentId。当我这样做时,更新失败,没有任何例外。

所以我最后写了一个像这样的单独方法。

@Query("UPDATE NodeEntity SET parentId = :newParentId, level=:newLevelId where id=:id AND parentId=:parentId")
    void moveNode(String newParentId,int newLevelId, String id, String parentId);

上面的方法,方法按预期工作。但不确定,为什么@update会默默地失败。

0 个答案:

没有答案