首页 > 解决方案 > 使用带关系的房间返回错误

问题描述

我有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,并通过关系更新各个实体。如果是这种情况,这可能是我出错的地方,我将如何使用该关系实现插入其他实体?

任何帮助将不胜感激,谢谢!

标签: androidandroid-room

解决方案


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

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

SQLite 中没有与之连接的对应表。因此,在他们的道的帮助下,您必须对您的 A、B、C 类进行所有更改。


推荐阅读