从房间查询数据但响应没有足够的模型字段?
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 的一个字段或整个构造函数。在您的特定情况下,主构造函数至少需要三个参数 name
、wordNumber
和 imageUrl
,因为它们没有默认值。
以下配置应该有效:
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
。
我有一个响应对象:
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 的一个字段或整个构造函数。在您的特定情况下,主构造函数至少需要三个参数 name
、wordNumber
和 imageUrl
,因为它们没有默认值。
以下配置应该有效:
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
。