Room 无法选择一个构造函数,因为多个构造函数是合适的错误
Room cannot pick a constructor since multiple constructors are suitable error
我尝试在我的 android kotlin 项目中实现持久库,但在编译时发现了这个错误:
error: Room cannot pick a constructor since multiple constructors are
suitable. Try to annotate unwanted constructors with @Ignore.
错误代码:
@Entity
data class Site(
var name: String = "",
var url: String = "",
@PrimaryKey(autoGenerate = true) var id: Long = 0)
我遇到这个错误是因为 Kotlin 显然为具有默认参数值的单个 Kotlin 构造函数生成了多个 Java 构造函数。工作代码见下:
@Entity
data class Site(
var name: String,
var url: String,
@PrimaryKey(autoGenerate = true) var id: Long)
这对我有用:
@Entity
data class Site(
@PrimaryKey(autoGenerate = true) var id: Long = 0),
var name: String = "",
var url: String = "",
@Ignore var ignored: String? = null
)
在这里你更改你的应用程序数据库version
并重新启动程序agian,它会工作:
@Database(entities = arrayOf(Site::class), version = 123) abstract class YourAppDatabase : RoomDatabase() {
abstract fun yourDao(): YourDao
}
你也可以试试这个 data class
:
@Entity
data class Site(@PrimaryKey(autoGenerate = true) var id: Long) {
@Ignore constructor() : this(0)
var name: String = "",
var url: String = "",
}
最后一条说明:您的主键 id
应该 手动递增 。
希望对你有用。 :)
测试证明以上答案无效。
data class TestModel(var id: Int = 0) {
constructor() : this(0)
var name: String = "defaultname"
var testData: String = "defaulttestData"
}
val testModel = TestModel(5)
testModel.name = "test"
val testModel2 = TestModel(5)
testModel2.testData = "testdata"
testModel2.name = "test"
info { "Test with name set: $testModel" }
info { "Testdata equals Testdata2 ${testModel.equals(testModel2)}" }
returns 使用名称集进行测试:TestModel(id=5) 并且 Testdata 等于 Testdata2 true
None 以上解决方案都很好,因为它们有效但可能会导致错误。
Kotlin 的 Data Class generates several Methods using the default constructor. That means that equals(), hashCode(),
toString(), componentN() functions and copy() 是使用您分配给构造函数的属性生成的。
像
一样使用上述解决方案
@Entity data class Site(@PrimaryKey(autoGenerate = true) var id: Long) {
@Ignore constructor() : this(0)
var name: String = ""
var url: String = ""
}
仅为 id 生成上面列出的所有方法。使用 equals 会导致不需要的质量,与 toString() 相同。解决这个问题需要您在构造函数中拥有所有要处理的属性,并使用 ignore like
添加第二个构造函数
@Entity data class Site(
@NonNull @PrimaryKey(autoGenerate = true) var id: Long,
var name: String = "",
var url: String = "") {
@Ignore constructor(id = 0, name = ", url = "") : this()
}
你真的应该记住,你通常使用数据 类 来拥有像 toString 和复制这样的方法。只有此解决方案可以在运行时避免不必要的错误。
留下我的答案以防对任何人有帮助。我 运行 遇到了同样的问题,上面的 none 答案有效。唯一有效的是从 data class
更改为 class
。我邀请任何人尝试相同的代码并解释为什么它成功了:
之前
@Entity
data class ImgurGalleryPost (
@NotNull @PrimaryKey
var id: String,
var title: String?,
var description: String?,
var datetime: Int?,
var cover: String?,
var coverWidth: Int?,
var coverHeight: Int?,
var accountUrl: String?,
var accountId: Int?,
var privacy: String?,
var layout: String?,
var views: Int?,
var link: String?,
var ups: Int?,
var downs: Int?,
var points: Int?,
var score: Int?,
var isAlbum: Boolean?,
var vote: Boolean?,
var favorite: Boolean?,
var nsfw: Boolean?,
var section: String?,
var commentCount: Int?,
var favoriteCount: Int?,
var topic: String?,
var topicId: Int?,
var imagesCount: Int?,
var inGallery: Boolean?,
var isAd: Boolean?,
@NotNull @Ignore
var tags: List<ImgurGalleryTag>,
var inMostViral: Boolean?,
@NotNull @Ignore
var images: List<ImgurGalleryImage>
)
之后
@Entity
class ImgurGalleryPost (
@NotNull @PrimaryKey
var id: String,
var title: String?,
var description: String?,
var datetime: Int?,
var cover: String?,
var coverWidth: Int?,
var coverHeight: Int?,
var accountUrl: String?,
var accountId: Int?,
var privacy: String?,
var layout: String?,
var views: Int?,
var link: String?,
var ups: Int?,
var downs: Int?,
var points: Int?,
var score: Int?,
var isAlbum: Boolean?,
var vote: Boolean?,
var favorite: Boolean?,
var nsfw: Boolean?,
var section: String?,
var commentCount: Int?,
var favoriteCount: Int?,
var topic: String?,
var topicId: Int?,
var imagesCount: Int?,
var inGallery: Boolean?,
var isAd: Boolean?,
@NotNull @Ignore
var tags: List<ImgurGalleryTag>,
var inMostViral: Boolean?,
@NotNull @Ignore
var images:
List<ImgurGalleryImage>
)
这真的很奇怪,但我怀疑这是 Android Studio 缓存问题,因为将其改回 data class
会导致错误再次出现。似乎这是集合字段的某种问题。我检查了生成的 class 中的构造函数,它看起来很好,我不知道为什么即使正确生成了构造函数,构建也会失败:
public ImgurGalleryPost(@org.jetbrains.annotations.NotNull()
java.lang.String id, @org.jetbrains.annotations.Nullable()
java.lang.String title, @org.jetbrains.annotations.Nullable()
java.lang.String description, @org.jetbrains.annotations.Nullable()
java.lang.Integer datetime, @org.jetbrains.annotations.Nullable()
java.lang.String cover, @org.jetbrains.annotations.Nullable()
java.lang.Integer coverWidth, @org.jetbrains.annotations.Nullable()
java.lang.Integer coverHeight, @org.jetbrains.annotations.Nullable()
java.lang.String accountUrl, @org.jetbrains.annotations.Nullable()
java.lang.Integer accountId, @org.jetbrains.annotations.Nullable()
java.lang.String privacy, @org.jetbrains.annotations.Nullable()
java.lang.String layout, @org.jetbrains.annotations.Nullable()
java.lang.Integer views, @org.jetbrains.annotations.Nullable()
java.lang.String link, @org.jetbrains.annotations.Nullable()
java.lang.Integer ups, @org.jetbrains.annotations.Nullable()
java.lang.Integer downs, @org.jetbrains.annotations.Nullable()
java.lang.Integer points, @org.jetbrains.annotations.Nullable()
java.lang.Integer score, @org.jetbrains.annotations.Nullable()
java.lang.Boolean isAlbum, @org.jetbrains.annotations.Nullable()
java.lang.Boolean vote, @org.jetbrains.annotations.Nullable()
java.lang.Boolean favorite, @org.jetbrains.annotations.Nullable()
java.lang.Boolean nsfw, @org.jetbrains.annotations.Nullable()
java.lang.String section, @org.jetbrains.annotations.Nullable()
java.lang.Integer commentCount, @org.jetbrains.annotations.Nullable()
java.lang.Integer favoriteCount, @org.jetbrains.annotations.Nullable()
java.lang.String topic, @org.jetbrains.annotations.Nullable()
java.lang.Integer topicId, @org.jetbrains.annotations.Nullable()
java.lang.Integer imagesCount, @org.jetbrains.annotations.Nullable()
java.lang.Boolean inGallery, @org.jetbrains.annotations.Nullable()
java.lang.Boolean isAd, @org.jetbrains.annotations.NotNull()
java.util.List<com.kimboo.core.model.ImgurGalleryTag> tags, @org.jetbrains.annotations.Nullable()
java.lang.Boolean inMostViral, @org.jetbrains.annotations.NotNull()
java.util.List<com.kimboo.core.model.ImgurGalleryImage> images) {
super();
}
如果有人能找到解决此问题的方法,而无需将 data class
更改为 class
,请随时在下方发表评论。
这对我有用
@Entity
data class TaskDetail @Ignore constructor(
@PrimaryKey(autoGenerate = true)
var id:Long = 0,
var taskId:Long = 0,
var content:String = "")
{
constructor():this(id = 0)
}
我使用@Ignore 来禁止 ROOM 警告
There are multiple good constructors and Room will pick the no-arg constructor. You can use the @Ignore annotation to eliminate unwanted constructors.
并为 ROOM 添加默认构造函数。
尝试将变量数据类型从 val 更改为 var :
之前:
@Entity
data class Product(
@PrimaryKey
val id: String = "",
val name: String = ""
)
之后:
@Entity
data class Product(
@PrimaryKey
var id: String = "",
var name: String = ""
)
错误是由构造函数中初始设置的变量引起的。如果您只有一个构造函数,请将您的代码更改为这个。
@Entity
data class Site(
val name: String,
val url: String,
@PrimaryKey(autoGenerate = true) val id: Long)
如果你也需要空构造函数,那么你应该这样做
@Entity
data class Site() {
constructor(name: String, url: String): this() {
this.name = name
this.url = url
}
var name: String = "",
var url: String = "",
@PrimaryKey(autoGenerate = true) var id: Long = 0
}
@Entity
data class Site @JvmOverloads constructor(
@ColumnInfo(name = "name") var name: String = "",
@ColumnInfo(name = "url") var url: String = "",
@PrimaryKey(autoGenerate = true) var id: Long = 0)
站点的不可变模型class。为了使用 Room 进行编译,我们可以使用 @JvmOverloads 来处理多个构造函数。
我通过升级我的 Room 和其他依赖项解决了这个问题。
只需尝试更新您的所有依赖项,它应该可以正常工作。
谢谢
我尝试在我的 android kotlin 项目中实现持久库,但在编译时发现了这个错误:
error: Room cannot pick a constructor since multiple constructors are suitable. Try to annotate unwanted constructors with @Ignore.
错误代码:
@Entity
data class Site(
var name: String = "",
var url: String = "",
@PrimaryKey(autoGenerate = true) var id: Long = 0)
我遇到这个错误是因为 Kotlin 显然为具有默认参数值的单个 Kotlin 构造函数生成了多个 Java 构造函数。工作代码见下:
@Entity
data class Site(
var name: String,
var url: String,
@PrimaryKey(autoGenerate = true) var id: Long)
这对我有用:
@Entity
data class Site(
@PrimaryKey(autoGenerate = true) var id: Long = 0),
var name: String = "",
var url: String = "",
@Ignore var ignored: String? = null
)
在这里你更改你的应用程序数据库version
并重新启动程序agian,它会工作:
@Database(entities = arrayOf(Site::class), version = 123) abstract class YourAppDatabase : RoomDatabase() {
abstract fun yourDao(): YourDao
}
你也可以试试这个 data class
:
@Entity
data class Site(@PrimaryKey(autoGenerate = true) var id: Long) {
@Ignore constructor() : this(0)
var name: String = "",
var url: String = "",
}
最后一条说明:您的主键 id
应该 手动递增 。
希望对你有用。 :)
测试证明以上答案无效。
data class TestModel(var id: Int = 0) {
constructor() : this(0)
var name: String = "defaultname"
var testData: String = "defaulttestData"
}
val testModel = TestModel(5)
testModel.name = "test"
val testModel2 = TestModel(5)
testModel2.testData = "testdata"
testModel2.name = "test"
info { "Test with name set: $testModel" }
info { "Testdata equals Testdata2 ${testModel.equals(testModel2)}" }
returns 使用名称集进行测试:TestModel(id=5) 并且 Testdata 等于 Testdata2 true
None 以上解决方案都很好,因为它们有效但可能会导致错误。
Kotlin 的 Data Class generates several Methods using the default constructor. That means that equals(), hashCode(), toString(), componentN() functions and copy() 是使用您分配给构造函数的属性生成的。
像
一样使用上述解决方案@Entity data class Site(@PrimaryKey(autoGenerate = true) var id: Long) {
@Ignore constructor() : this(0)
var name: String = ""
var url: String = ""
}
仅为 id 生成上面列出的所有方法。使用 equals 会导致不需要的质量,与 toString() 相同。解决这个问题需要您在构造函数中拥有所有要处理的属性,并使用 ignore like
添加第二个构造函数@Entity data class Site(
@NonNull @PrimaryKey(autoGenerate = true) var id: Long,
var name: String = "",
var url: String = "") {
@Ignore constructor(id = 0, name = ", url = "") : this()
}
你真的应该记住,你通常使用数据 类 来拥有像 toString 和复制这样的方法。只有此解决方案可以在运行时避免不必要的错误。
留下我的答案以防对任何人有帮助。我 运行 遇到了同样的问题,上面的 none 答案有效。唯一有效的是从 data class
更改为 class
。我邀请任何人尝试相同的代码并解释为什么它成功了:
之前
@Entity
data class ImgurGalleryPost (
@NotNull @PrimaryKey
var id: String,
var title: String?,
var description: String?,
var datetime: Int?,
var cover: String?,
var coverWidth: Int?,
var coverHeight: Int?,
var accountUrl: String?,
var accountId: Int?,
var privacy: String?,
var layout: String?,
var views: Int?,
var link: String?,
var ups: Int?,
var downs: Int?,
var points: Int?,
var score: Int?,
var isAlbum: Boolean?,
var vote: Boolean?,
var favorite: Boolean?,
var nsfw: Boolean?,
var section: String?,
var commentCount: Int?,
var favoriteCount: Int?,
var topic: String?,
var topicId: Int?,
var imagesCount: Int?,
var inGallery: Boolean?,
var isAd: Boolean?,
@NotNull @Ignore
var tags: List<ImgurGalleryTag>,
var inMostViral: Boolean?,
@NotNull @Ignore
var images: List<ImgurGalleryImage>
)
之后
@Entity
class ImgurGalleryPost (
@NotNull @PrimaryKey
var id: String,
var title: String?,
var description: String?,
var datetime: Int?,
var cover: String?,
var coverWidth: Int?,
var coverHeight: Int?,
var accountUrl: String?,
var accountId: Int?,
var privacy: String?,
var layout: String?,
var views: Int?,
var link: String?,
var ups: Int?,
var downs: Int?,
var points: Int?,
var score: Int?,
var isAlbum: Boolean?,
var vote: Boolean?,
var favorite: Boolean?,
var nsfw: Boolean?,
var section: String?,
var commentCount: Int?,
var favoriteCount: Int?,
var topic: String?,
var topicId: Int?,
var imagesCount: Int?,
var inGallery: Boolean?,
var isAd: Boolean?,
@NotNull @Ignore
var tags: List<ImgurGalleryTag>,
var inMostViral: Boolean?,
@NotNull @Ignore
var images:
List<ImgurGalleryImage>
)
这真的很奇怪,但我怀疑这是 Android Studio 缓存问题,因为将其改回 data class
会导致错误再次出现。似乎这是集合字段的某种问题。我检查了生成的 class 中的构造函数,它看起来很好,我不知道为什么即使正确生成了构造函数,构建也会失败:
public ImgurGalleryPost(@org.jetbrains.annotations.NotNull()
java.lang.String id, @org.jetbrains.annotations.Nullable()
java.lang.String title, @org.jetbrains.annotations.Nullable()
java.lang.String description, @org.jetbrains.annotations.Nullable()
java.lang.Integer datetime, @org.jetbrains.annotations.Nullable()
java.lang.String cover, @org.jetbrains.annotations.Nullable()
java.lang.Integer coverWidth, @org.jetbrains.annotations.Nullable()
java.lang.Integer coverHeight, @org.jetbrains.annotations.Nullable()
java.lang.String accountUrl, @org.jetbrains.annotations.Nullable()
java.lang.Integer accountId, @org.jetbrains.annotations.Nullable()
java.lang.String privacy, @org.jetbrains.annotations.Nullable()
java.lang.String layout, @org.jetbrains.annotations.Nullable()
java.lang.Integer views, @org.jetbrains.annotations.Nullable()
java.lang.String link, @org.jetbrains.annotations.Nullable()
java.lang.Integer ups, @org.jetbrains.annotations.Nullable()
java.lang.Integer downs, @org.jetbrains.annotations.Nullable()
java.lang.Integer points, @org.jetbrains.annotations.Nullable()
java.lang.Integer score, @org.jetbrains.annotations.Nullable()
java.lang.Boolean isAlbum, @org.jetbrains.annotations.Nullable()
java.lang.Boolean vote, @org.jetbrains.annotations.Nullable()
java.lang.Boolean favorite, @org.jetbrains.annotations.Nullable()
java.lang.Boolean nsfw, @org.jetbrains.annotations.Nullable()
java.lang.String section, @org.jetbrains.annotations.Nullable()
java.lang.Integer commentCount, @org.jetbrains.annotations.Nullable()
java.lang.Integer favoriteCount, @org.jetbrains.annotations.Nullable()
java.lang.String topic, @org.jetbrains.annotations.Nullable()
java.lang.Integer topicId, @org.jetbrains.annotations.Nullable()
java.lang.Integer imagesCount, @org.jetbrains.annotations.Nullable()
java.lang.Boolean inGallery, @org.jetbrains.annotations.Nullable()
java.lang.Boolean isAd, @org.jetbrains.annotations.NotNull()
java.util.List<com.kimboo.core.model.ImgurGalleryTag> tags, @org.jetbrains.annotations.Nullable()
java.lang.Boolean inMostViral, @org.jetbrains.annotations.NotNull()
java.util.List<com.kimboo.core.model.ImgurGalleryImage> images) {
super();
}
如果有人能找到解决此问题的方法,而无需将 data class
更改为 class
,请随时在下方发表评论。
这对我有用
@Entity
data class TaskDetail @Ignore constructor(
@PrimaryKey(autoGenerate = true)
var id:Long = 0,
var taskId:Long = 0,
var content:String = "")
{
constructor():this(id = 0)
}
我使用@Ignore 来禁止 ROOM 警告
There are multiple good constructors and Room will pick the no-arg constructor. You can use the @Ignore annotation to eliminate unwanted constructors.
并为 ROOM 添加默认构造函数。
尝试将变量数据类型从 val 更改为 var :
之前:
@Entity
data class Product(
@PrimaryKey
val id: String = "",
val name: String = ""
)
之后:
@Entity
data class Product(
@PrimaryKey
var id: String = "",
var name: String = ""
)
错误是由构造函数中初始设置的变量引起的。如果您只有一个构造函数,请将您的代码更改为这个。
@Entity
data class Site(
val name: String,
val url: String,
@PrimaryKey(autoGenerate = true) val id: Long)
如果你也需要空构造函数,那么你应该这样做
@Entity
data class Site() {
constructor(name: String, url: String): this() {
this.name = name
this.url = url
}
var name: String = "",
var url: String = "",
@PrimaryKey(autoGenerate = true) var id: Long = 0
}
@Entity
data class Site @JvmOverloads constructor(
@ColumnInfo(name = "name") var name: String = "",
@ColumnInfo(name = "url") var url: String = "",
@PrimaryKey(autoGenerate = true) var id: Long = 0)
站点的不可变模型class。为了使用 Room 进行编译,我们可以使用 @JvmOverloads 来处理多个构造函数。
我通过升级我的 Room 和其他依赖项解决了这个问题。
只需尝试更新您的所有依赖项,它应该可以正常工作。
谢谢