android - 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。
解决方案
您需要修复此查询:
@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>
推荐阅读
- visual-studio-code - Visual Studio Code:从搜索中排除路径
- go - 如何在官方 neo4j go 驱动程序中解析结果?
- python - 获取 usr/bin/python2.7:没有这样的文件或目录
- php - 如何在wordpress中将新的用户元键插入数据库
- python - 特定 ISO 格式的 Pandas 日期时间转换
- python-2.7 - 如何使用ascii将字符更改为之前的字符
- c - 从函数中获取随机字符
- debugging - 程序集:如何生成 .section .debug_info?
- c# - unity移除碰撞物理效果,还要检查是否有碰撞
- asciidoc - 如何在 asciidoc 内联锚中转义“/”字符?