【问题标题】:Room The columns returned by the query does not have the fieldsRoom 查询返回的列没有字段
【发布时间】:2020-11-30 16:01:36
【问题描述】:

我在“订单”中保留了一份产品列表。 当我尝试从 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

OrdersDao

   @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: 错误:查询返回的列没有 有田地 [id,orderId,name,pathImage,price,priceDiscount,productId,quantity,units,createdAt,updatedAt,brgew,gewei] 在 com.vepe.navigation.model.entity.Product 即使它们是 注释为非空或原始。查询返回的列: [列表产品] 公共抽象 java.util.List getBasketHistoryFromOrderById(long orderId);当前 JDK 版本 1.8.0_272-b10 有一个错误 (https://bugs.openjdk.java.net/browse/JDK-8007720) 会阻止 Room 从增量。考虑使用 JDK 11+ 或嵌入式 JDK 随 Android Studio 提供 3.5+.C:\Users\mind\StudioProjects\Sarah_navigationProject\ProjectAndroid\app\build\tmp\kapt3\stubs\debug\com\vepe\navigation\model\entity\Product.java:8: 错误:实体类必须用@Entity注解

请帮帮我!谢谢

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

错误:查询返回的列没有字段 [id,orderId,name,pathImage,price,priceDiscount,productId,quantity,units,createdAt,updatedAt,brgew,gewei] 在 com.vepe.navigation.model.entity.Product 即使它们是 注释为非空或原始。查询返回的列: [列表产品] 公共抽象 kotlinx.coroutines.flow.Flow> getBasketHistoryFromOrderById(long orderId);当前 JDK 版本 1.8.0_272-b10 有一个错误 (https://bugs.openjdk.java.net/browse/JDK-8007720) 会阻止 Room 从增量。考虑使用 JDK 11+ 或嵌入式 JDK 随 Android Studio 提供 3.5+.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, 名称、包装、pathImage、价格、priceDiscount、productId、数量、 units, createdAt, updatedAt, brgew, gewei] 不是由 查询。如果不应该从结果中读取它们,您 可以用@Ignore 注解标记它们。您可以禁止显示此警告 通过用注释方法 @SuppressWarnings(RoomWarnings.CURSOR_MISMATCH)。返回的列 查询:listProduct。中的字段 com.vepe.navigation.model.entity.Product: id, orderId, name, 包装,pathImage,价格,priceDiscount,productId,数量, 单位、createdAt、updatedAt、brgew、gewei。

【问题讨论】:

  • 您是否尝试过将Product 类中的所有列都设为空?
  • @DCruz22 是的,我试过了,我有这个错误error: Not sure how to convert a Cursor to this method's return type (ru.gkomega.maumarket.model.entity.Product). 及以下If they are not supposed to be read from the result, you can mark them with @Ignore annotation. You can suppress this warning by annotating the method with @SuppressWarnings(RoomWarnings.CURSOR_MISMATCH). Columns returned by the query: listProduct.

标签: android kotlin gson android-room


【解决方案1】:

我想出了这个方法来解决这个问题

在订单服务中

@GET("orders/baskethistory/id/{id}")
suspend fun getBasketHistoryById(@Path("id") id: Long): Response<BasketHistory>

对象列表的数据类

data class BasketHistory(
    @SerializedName("basketHistory") val listProduct : MutableList<Product>
)

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

试试看

【讨论】:

    【解决方案2】:

    您需要修复此查询:

    @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>
    

    【讨论】:

    • 问题是当我拉出整个对象时,我无法链接数据库和适配器的自动更新
    • 很抱歉,您的评论描述性不强。您的帖子是关于编译错误的,没有关于适配器或自动更新的内容。要获得帮助,您应该更具体地了解您的问题。
    【解决方案3】:

    这是直截了当的,有时有很多查询和数据类我们错过了我们需要什么我们在代码中编写的内容

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

    您在上述查询中返回 Order LiveData,但要求 listProduct 也不正确

    • 制作'*'(获取订单列表/单笔订单)

      @Query("SELECT * FROM ${Order.TABLE_NAME} WHERE ID = :orderId") fun getBasketById(orderId: Long): LiveData&lt;Order&gt;

    • 或者将返回值改为LiveData>

      @Query("SELECT listProduct FROM ${Order.TABLE_NAME} WHERE ID = :orderId") fun getBasketById(orderId: Long): LiveData&lt;List&lt;Product&gt;&gt;

    这会解决你的问题。

    除此之外,我还添加了房间转换,

    object RoomConverters {
    
         @TypeConverter
            @JvmStatic
            fun restoreModelList(listOfString: String): List<RoomModelList> {
                return Gson().fromJson(listOfString, object : TypeToken<List<RoomModelList>>() {
                }.type)
            }
        
            @TypeConverter
            @JvmStatic
            fun saveModelListAsString(listOfString: List<RoomModel>): String {
                return Gson().toJson(listOfString)
            }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多