将Room与关系一起使用会返回错误

时间:2020-05-21 18:51:36

标签: android android-room

我有3个实体,A,B,C。

实体A与B和C有关。

为了对此关系建模,我这样做:

public class RelationA {
   @Embedded public A a;

   @Relation(parentColumn = "ID", entityColumn = "bID", entity=B.class)
   public B b;

   @Relation(parentColumn = "ID", entityColumn = "cID", entity=C.class)
   public C c;
}

我对此关系有一个Dao

@Dao
public abstract class RelationADao extends BaseDao<RelationA> {
    // Add more methods for more custom operations
}

对于普通类型BaseDao,通常使用T进行插入,更新,删除操作。

这是我的RoomDatabase

@Database(entities = {A.class, B.class, C.class}, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
   public abstract RelationADao relationADao();

   // initialization code here...
}

我收到以下错误,我不明白为什么。

 error: Type of the parameter must be a class annotated with @Entity or a collection/array 
 of it.
     public abstract void insert( T entity);`
                               ^

如果您对BaseDao实现感到好奇,我将其包括在内:

@Dao
public abstract class BaseDao<T> {
    @Update
    public abstract void update( T entity);

    @Delete
    public abstract void delete( T entity);

    @Insert
    public abstract void insert( T entity);
}

我的理解是,我可以建立一个Relation和一个相应的Dao,并通过该关系更新各个实体。 如果是这样的话,这是我出问题的地方吗?如何使用该关系实现插入到其他实体中?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我的理解是我可以建立一个Relation和一个对应的 并通过该关系更新各个实体。可能 如果是这种情况,这就是我做错的地方 使用该关系插入其他实体吗?

不,您的RelationA类仅具有一个有用的功能-它可用于从查询中获取这种类型的结果。您不能使用它来插入/更新/删除值,就像在@Entity注释的类中一样。与ROOM中您的类中的两个Relations等效-是在SQL查询中添加到表A中的两个左连接(B,C表)的集合。

SQLite中没有与其连接的对应表。因此,所有更改都必须借助其Dao对A,B,C类进行。