gpt4 book ai didi

Android Room 无法识别 List 的 TypeConverer

转载 作者:太空狗 更新时间:2023-10-29 13:50:01 25 4
gpt4 key购买 nike

这是我的实体:

@Entity(tableName = "commits")
data class Commit(
@PrimaryKey
@ColumnInfo(name = "hash")
val hash: String,
@ColumnInfo(name = "changes", typeAffinity = ColumnInfo.BLOB)
var changes: List<DbChange>
)

这是转换器:

class Converters {
companion object {
@JvmStatic
@TypeConverter
fun changesToByteArray(changes: List<DbChange>): ByteArray {
...
}

@JvmStatic
@TypeConverter
fun byteArrayToChanges(bytes: ByteArray): List<DbChange> {
...
}
}
}

而且我已经将 Converters 类添加到注释中:

@Database(entities = [Commit::class], version = 1)
@TypeConverters(Converters::class)
abstract class AppRoomDatabase : RoomDatabase() {
...
}

但编译器仍然报错:

e: /home/perqin/workspaces/cent-budget/cent-budget/app/build/tmp/kapt3/stubs/eaDebug/com/perqin/centbudget/data/sync/commit/Commit.java:20: error: Cannot figure out how to save this field into database. You can consider adding a type converter for it.
private java.util.List<? extends com.perqin.centbudget.data.sync.changes.DbChange> changes;

如何解决这个问题?我完全没有想法...

最佳答案

这实际上是 Kotlin 的错,而不是 Room 的错。
正如您在错误消息中看到的那样,您得到了 List<? extends DbChange>而不是 List<DbChange>对于 changes字段,因此 Room 试图找到 TypeConverters对于 byte[] -> List<? extends DbChange>List<? extends DbChange> -> byte[] , 但没有这样做。

那是因为changesToByteArray方法参数类型生成为 List<? extends DbChange> , 但是 byteArrayToChanges 的类型方法还是List<DbChange>因此你会得到一个编译错误。

我会推荐 this如果您想阅读更多文章。

解决方案 1:
使用 @JvmSuppressWildcards
注释 Commit类,以便为 changes 生成不带通配符的类型字段及其 setter :

@Entity(tableName = "commits")
@JvmSuppressWildcards
data class Commit(
@PrimaryKey
@ColumnInfo(name = "hash")
val hash: String,

@ColumnInfo(name = "changes", typeAffinity = ColumnInfo.BLOB)
var changes: List<DbChange>
)

注释 List出于同样原因的类型:

class Converters {
companion object {
@JvmStatic
@TypeConverter
fun changesToByteArray(changes: List<@JvmSuppressWildcards DbChange>): ByteArray {
...
}

@JvmStatic
@TypeConverter
fun byteArrayToChanges(bytes: ByteArray): List<DbChange> {
...
}
}
}

解决方案 2:
为您的列表创建包装器类,例如:

data class DbChanges(val list: List<DbChange>)

然后更新Commit类:

@Entity(tableName = "commits")
data class Commit(
@PrimaryKey
@ColumnInfo(name = "hash")
val hash: String,

@ColumnInfo(name = "changes", typeAffinity = ColumnInfo.BLOB)
var changes: DbChanges
)

并写入新的TypeConverters :

class Converters {
companion object {
@JvmStatic
@TypeConverter
fun changesToByteArray(changes: DbChanges): ByteArray {
...
}

@JvmStatic
@TypeConverter
fun byteArrayToChanges(bytes: ByteArray): DbChanges {
...
}
}
}

关于Android Room 无法识别 List 的 TypeConverer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49358773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com