从房间查询数据但响应没有足够的模型字段?

Query data from room but response not enough fields of model?

我有一个响应对象:

class TopicResponse(
    var id: Int = 0,
    val name: String,
    var wordNumber: Int,
    @Ignore
    var imageUrl:String
)

我的查询:

@Dao
interface TopicDao {
    @Query("select Topic.id,Topic.name,count(*) as wordNumber 
    from Topic,WordDetails 
    where Topic.id = WordDetails.topicId group by Topic.id")
    fun getTotalTopic(): List<TopicResponse>
}

响应有 3 个字段:id、name、wordNumber。我无法构建错误的应用程序:

Tried the following constructors but they failed to match:
TopicResponse(int,java.lang.String,int,java.lang.String) -> 
[param:id -> matched field:id, param:name -> matched field:name, param:wordNumber -> matched field:wordNumber, param:imageUrl -> matched field:unmatched]D:\personal\flashcardgame\FlashCard\app\build\tmp\kapt3\stubs\debug\com\ribisoft\english\flashcard\model\TopicResponse.java:9: error: Cannot find setter for field.
private final java.lang.String name = null;

请帮帮我,非常感谢!

您不能在构造函数参数上使用 @Ignore 注释。

这里是@Ignore注解的目标:

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR})

这意味着您可以忽略方法、class 的一个字段或整个构造函数。在您的特定情况下,主构造函数至少需要三个参数 namewordNumberimageUrl,因为它们没有默认值。

以下配置应该有效:

class TopicResponse {
    var id: Int = 0
    val name: String
    var wordNumber: Int
    var imageUrl:String

    @Ignore
    constructor(
        id: Int = 0,
        name: String,
        wordNumber: Int,
        imageUrl:String
    ) {
        this.id = id
        this.name = name
        this.wordNumber = wordNumber
        this.imageUrl = imageUrl
    }
    
    // This constructor will be used by DAO
    constructor(id: Int = 0, name: String, wordNumber: Int): this(id, name, wordNumber, "")
}

如果 imageUrl 不是来自 API,那 imageUrl 来自哪里?我只是假设你是从其他地方得到它的。在这种情况下,您应该使用如下所示的 NetworkTopicResponse

class NetworkTopicResponse(
var id: Int = 0,
val name: String,
var wordNumber: Int
)

然后您可以稍后将其转换为 TopicResponse