【问题标题】:Making a Room DAO class implement another interface使 Room DAO 类实现另一个接口
【发布时间】:2019-07-22 06:51:30
【问题描述】:

我有一个域层和数据层。可以这样做吗?

User.javaUserDao.java

数据UserRoomEntity.javaUserRoomDao.java

我希望我的所有数据源都实现UserDao。当我让UserRoomDao 实现UserDao 接口时,我收到错误,我应该用@insert 和其余的Room 注释来注释UserDao.java 函数。 Room可以做到这一点吗?

@Dao
public abstract class UserRoomDao implments UserDao{

    @Insert
    public abstract void insert(User...users);

    @Update
    public abstract void update(User...users);

    @Delete
    public abstract void delete(User...users);

public interface UserDao {


    public void insert(UserModel... userModels);

    public void delete(UserModel... userModels);

    public void update(UserModel... userModels);

}

我在UserDao 中收到此错误。

错误:一个抽象的 DAO 方法必须用一个注解,而且只有一个 以下注解:Insert、Delete、Query、Update、RawQuery

【问题讨论】:

  • 能否提供一些代码?
  • 请给出一些你想要实现的代码,即使它不起作用,只是显示你想要实现的目标
  • 我已经添加了代码。

标签: android android-room


【解决方案1】:

您必须创建 UserRoomDaoabstract 并标记 UserDao abstract 中的方法,以便 Room 为它们提供实现。

【讨论】:

  • 我做到了。 UserDao 是一个接口,而 UserRoomDoa 是一个抽象类。但是当我在 UserRoomDao 中实现 UserDao 时出现此错误。错误:抽象 DAO 方法必须使用以下注释中的一个且仅一个注释:Insert、Delete、Query、Update、RawQuery
【解决方案2】:

我使用 UserRoomDao 接口扩展 UserDao 并覆盖方法。它对我有用。

 public interface UserDao {

    Flowable<User> getUser();

    Completable insertUser(User user);

    void deleteAllUsers(); 
}

@Dao
public interface UserRoomDao extends UserDao {

    @Query("SELECT * FROM Users LIMIT 1")
    Flowable<User> getUser();

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    Completable insertUser(User user);

    @Query("DELETE FROM Users")
    void deleteAllUsers();
}

确保从 UsersDatabase 返回 UserRoomDao

@Database(entities = {User.class}, version = 1)
public abstract class UsersDatabase extends RoomDatabase {

    public abstract UserRoomDao userRoomDao();
}

【讨论】:

    【解决方案3】:

    您的UserDao 课程中缺少@Dao 注释。你也错过了abstract 关键字。如此完整的示例:

    @Dao
    public abstract class UserRoomDao extend UserDao{
    
        @Insert
        public abstract void insert(User...users);
    
        @Update
        public abstract void update(User...users);
    
        @Delete
        public abstract void delete(User...users);
    }
    

    并将接口更改为类。 (您可以同时保留 UserDao 和 UserRoomDao 作为界面

    public abstract class UserDao {
    
       @Insert
        public void insert(UserModel... userModels);
        @Update
        public void delete(UserModel... userModels);
       @Delete
        public void update(UserModel... userModels);
    
    }
    

    建议: 制作通用 dao 类,以便其他 dao 可以使用它。喜欢:

    @Dao 
    public abstract interface MyGenericDao<T>{
            @Insert(onConflict = OnConflictStrategy.REPLACE)
            public abstract long insertOrUpdate(T row);
    
            @Update
            public abstract int update(T... objects);
    
            @Delete
            public abstract int delete(T... objects);
        }
    

    现在您可以在您的其他 dao 中使用此通用 dao,以便插入或更新(通用工作)将由通用 dao 覆盖,无需再次实现任何相同的方法。

    【讨论】:

      猜你喜欢
      • 2020-11-21
      • 2016-04-28
      • 2022-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-21
      • 2020-06-25
      相关资源
      最近更新 更多