首页 > 解决方案 > Room 查询返回的列没有字段

问题描述

我在“订单”中保留了一份产品清单。当我尝试从 Room 获取产品列表时。我收到以下错误。但是我做了一个TypeConvertor。可能是什么错误?

命令

   @Entity(tableName = Order.TABLE_NAME)
@JsonClass(generateAdapter = true)
data class Order(
    @PrimaryKey(autoGenerate = true)
    val id: Long,
    val isSendCheque: Int,
    val phone: String,
    val name: String,
    val comment: String? = "",
    val timeFrom: String,
    val timeTo: String,
    @TypeConverters(Converters::class)
    @ColumnInfo(name = "listProduct")
    var listProduct: List<Product>? = null,
    val publicOrderId: String
) {
    companion object {
        const val TABLE_NAME = "mau_order"
    }
}

产品

@Parcelize
@JsonClass(generateAdapter = true)
data class Product(
        @SerializedName("id")
        @PrimaryKey
        var id: Long = -1,
        @SerializedName("order_id") var orderId: Long = -1,
        @SerializedName("name") var name: String = "name product",
        @SerializedName("packaging") var packaging: String? = "1 кг",
        @SerializedName("path_image") var pathImage: String = "",
        @SerializedName("price") var price: Double = 0.0,
        @SerializedName("price_discount") var priceDiscount: Double = 0.0,
        @SerializedName("product_id") var productId: Int = -1,
        @SerializedName("quantity") var quantity: Double = 0.0,
        @SerializedName("units") var units: String = "ШТ",
        @SerializedName("created_at") var createdAt: String = "",
        @SerializedName("updated_at") var updatedAt: String = "",
        @SerializedName("brgew") var brgew: String = "",
        @SerializedName("gewei") var gewei: String = "кг"
) : Parcelable

订单道

   @Dao
interface OrdersDao {
    /**
     * Inserts [orders] into the [Order.TABLE_NAME] table.
     * Duplicate values are replaced in the table.
     * @param orders Orders
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertOrders(orders: List<Order>)
    /**
     * Inserts [orders] into the [Order.TABLE_NAME] table.
     * Duplicate values are replaced in the table.
     * @param orders Orders
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertOrders(order: Order)

    /**
     * Deletes all the orders from the [Order.TABLE_NAME] table.
     */
    @Query("DELETE FROM ${Order.TABLE_NAME}")
    suspend fun deleteAllOrders()

    /**
     * Fetches the order from the [Order.TABLE_NAME] table whose id is [orderId].
     * @param orderId Unique ID of [Order]
     * @return [Flow] of [Order] from database table.
     */
    @Query("SELECT * FROM ${Order.TABLE_NAME} WHERE ID = :orderId")
    fun getOrderById(orderId: Long): LiveData<Order>

    //ERROR
    @Query("SELECT listProduct FROM ${Order.TABLE_NAME} WHERE ID = :orderId")
    fun getBasketById(orderId: Long): LiveData<Order>

    /**
     * Fetches all the orders from the [Order.TABLE_NAME] table.
     * @return [Flow]
     */
    @Query("SELECT * FROM ${Order.TABLE_NAME}")
    fun getAllOrders(): LiveData<List<Order>>
}

转换器

 @TypeConverter
fun stringToProductList(data: String?): MutableList<Product> {
    if (data == null) {
        return Collections.emptyList()
    }

    val listType = object : TypeToken<MutableList<Product>>() {

    }.type

    return gson.fromJson(data, listType)
}

@TypeConverter
fun ProductListToString(someObjects: MutableList<Product>?): String? {
    if (someObjects == null) {
        return null
    }
    return gson.toJson(someObjects)
}

错误

OrdersDao.java:53: 错误:查询返回的列在 com.vepe 中没有字段 [id,orderId,name,pathImage,price,priceDiscount,productId,quantity,units,createdAt,updatedAt,brgew,gewei] .navigation.model.entity.Product 即使它们被注释为非空或原始。查询返回的列: [listProduct] public abstract java.util.List<com.vepe.navigation.model.entity.Product> getBasketHistoryFromOrderById(long orderId); 当前的 JDK 版本 1.8.0_272-b10 有一个错误(https://bugs.openjdk.java.net/browse/JDK-8007720) 防止 Room 是增量的。考虑使用 JDK 11+ 或 Android Studio 3.5+ 附带的嵌入式 JDK。C:\Users\mind\StudioProjects\Sarah_navigationProject\ProjectAndroid\app\build\tmp\kapt3\stubs\debug\com\vepe\navigation\model\entity \Product.java:8: 错误:实体类必须用@Entity 注释

请帮帮我 !谢谢

更新 我试图把 @Entity 注释我不知道它们是否在我的情况下是必要的并且得到了以下错误

错误:查询返回的列在com.vepe.navigation.model.entity中没有字段[id,orderId,name,pathImage,price,priceDiscount,productId,quantity,units,createdAt,updatedAt,brgew,gewei] .Product 即使它们被注释为非空或原始。查询返回的列: [listProduct] public abstract kotlinx.coroutines.flow.Flow<java.util.List<com.vepe.navigation.model.entity.Product>> getBasketHistoryFromOrderById(long orderId); 当前的 JDK 版本 1.8.0_272-b10 有一个错误(https://bugs.openjdk.java.net/browse/JDK-8007720) 防止 Room 是增量的。考虑使用 JDK 11+ 或 Android Studio 3.5+ 附带的嵌入式 JDK。C:\Users\mind\StudioProjects\Sarah_navigationProject\ProjectAndroid\app\build\tmp\kapt3\stubs\debug\com\vepe\navigation\data\local \dao\OrdersDao.java:53: 警告:查询返回一些列 [listProduct] 不被 com.vepe.navigation.model.entity.Product 使用。您可以在字段上使用 @ColumnInfo 注释来指定映射。com.vepe.navigation.model.entity.Product 有一些字段 [id, orderId, name, packaging, pathImage, price, priceDiscount, productId, quantity, units, createdAt, updatedAt, brgew, gewei] 查询未返回. 如果不应该从结果中读取它们,则可以使用 @Ignore 注释对其进行标记。您可以通过使用 @SuppressWarnings(RoomWarnings.CURSOR_MISMATCH) 注释方法来抑制此警告。查询返回的列:listProduct。com.vepe.navigation.model.entity.Product 中的字段:id、orderId、name、packing、pathImage、price、priceDiscount、productId、数量、单位、createdAt、updatedAt、brgew、gewei。

标签: androidkotlingsonandroid-room

解决方案


您需要修复此查询:

@Query("SELECT listProduct FROM ${Order.TABLE_NAME} WHERE ID = :orderId")
    fun getBasketById(orderId: Long): LiveData<Order>

问题是所选字段 ( listProduct) 和返回类型 ( Order) 不匹配。Room 抱怨它无法理解如何构建Order只有一个字段的实例 - listProduct

修复它的最简单方法是选择创建Order实例所需的所有字段:

@Query("SELECT * FROM ${Order.TABLE_NAME} WHERE ID = :orderId")
    fun getBasketById(orderId: Long): LiveData<Order>

推荐阅读