操作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