WBL*_*ord 5 android gson kotlin 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"
}
}
Run Code Online (Sandbox Code Playgroud)
产品
@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
Run Code Online (Sandbox Code Playgroud)
订单道
@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>>
}
Run Code Online (Sandbox Code Playgroud)
转换器
@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)
}
Run Code Online (Sandbox Code Playgroud)
错误
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: 警告:查询返回了一些未被 com.vepe.navigation.model.entity.Product 使用的列 [listProduct]。您可以在字段上使用 @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、packaging、pathImage、price、priceDiscount、productId、quantity、units、createdAt、updatedAt、brgew、gewei。
我想出了这个方法来解决这个问题
有序服务
@GET("orders/baskethistory/id/{id}")
suspend fun getBasketHistoryById(@Path("id") id: Long): Response<BasketHistory>
Run Code Online (Sandbox Code Playgroud)
对象列表的数据类
data class BasketHistory(
@SerializedName("basketHistory") val listProduct : MutableList<Product>
)
Run Code Online (Sandbox Code Playgroud)
道
@Query("SELECT id,listProduct FROM ${Order.TABLE_NAME} WHERE ID = :orderId")
fun getBasketById(orderId: Long): LiveData<BasketHistory>
Run Code Online (Sandbox Code Playgroud)
尝试一下
归档时间: |
|
查看次数: |
566 次 |
最近记录: |