An abstract DAO method must be annotated with one and only one of the following

54 阅读1分钟

操作Android Room 数据表插入编译出错:

An abstract DAO method must be annotated with one and only one of the following annotations: Insert,Delete,Query,Update,RawQuery

public abstract com.example.lanidemokt.db.dao.OrderOfflineDao getOrderDao();

原因是:多表查询插入的DAO里也有相同的表的操作DAO,ROOM判断实例化多个表OrderOffline了报错

OrderOffline的Dao

@Dao
interface OrderOfflineDao {
    //DAO的方法调用都在当前线程进行,所以要避免在UI线程直接访问
    @Query("SELECT * FROM OrderOffline")
    fun getAll(): List<OrderOffline>

    @Query("select orderId from ORDEROFFLINE where  orderId like :date  order by orderId desc limit 1")
    fun findMaxOrderIdByDate(date: String): String?

    @Query("select _id from ORDEROFFLINE where orderId=:orderId")
    fun findIdByOrderId(orderId: String): Long?

    @Query("select * from ORDEROFFLINE where orderId in (select max(_id) from orderOffline) limit 1")
    fun findMaxIdOrder(): OrderOffline?

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertOrders(order: List<OrderOffline>): List<Long>?

    //插入一条记录
    @Insert(onConflict = OnConflictStrategy.ABORT)
    fun insertOrder(vararg order: OrderOffline)


    //修改订单状态,vararg 一个或者多个order
    @Update(onConflict = OnConflictStrategy.REPLACE)
    fun changeOrderStatus(vararg order: OrderOffline)

    // todo 查询当前用户未提交的订单列表
}

多表操作的DAO

@Dao
interface OrderDetailsEpcDao {
    var orderDao: OrderOfflineDao
    var detailsDao: OrderDetailsOfflineDao
    @Transaction
    fun insertUserWithOrders(order: OrderOffline, vararg orders: OrderDetailsOffline) {
        // 先插入用户数据,获取用户ID(如果需要)
        val orderId = orderDao.insertOrder(order)
        // 再插入订单数据,更新订单中的userId为新插入的用户ID(如果有外键关联)
        orders.forEach { it.orderId = 0L  } // 如果userId不是自增的,这里需要调整策略,比如预先知道userId或者使用事务返回的新ID等。这里假设userId是自增的。
        detailsDao.insertGoods(*orders) // 使用可变参数传递多个订单对象。注意这里是*orders而不是orders。
    }
}

初始化数据库

abstract class AppDataBase : RoomDatabase() {
    abstract fun orderOfflineDao(): OrderOfflineDao
    abstract fun orderDetailsOfflineDao(): OrderDetailsOfflineDao
    abstract fun epcByOrderDetailsOfflineDao(): EpcByOrderDetailsOfflineDao
    abstract fun orderDetailsEpcDao(): OrderDetailsEpcDao //多表操作Dao

解决: 不能再用多表Dao,把以下删除

//abstract fun orderDetailsEpcDao(): OrderDetailsEpcDao //多表操作Dao