使用 kotlin.UByte 作为房间实体不起作用

2024-01-23

我想将以下数据类存储在我的房间数据库中。不知怎的,我没有成功:

@Entity
data class UInt8(
    @PrimaryKey(autoGenerate = true)
    var key: Int,
    var name: String = "uint8-test",
    var value: UByte = 0.toUByte(),
    var size: Int = 1,
    var readOnly: Boolean = true
) 

我总是收到错误自动生成的构建文件:

C:<...>\UInt8.java:15: error: Cannot find getter for field.
    private byte value;
Cannot find getter for field.

同样适用于UShort, UInt and ULong.

但是,如果我将其替换为Int,它似乎有效,但不是我的意图(它需要是一个 UByte.


build.grade (from 开发者.android.com https://developer.android.com/training/data-storage/room):

def room_version = "2.4.2"

//implementation "androidx.room:room-runtime:$room_version"
//annotationProcessor "androidx.room:room-compiler:$room_version"


implementation "androidx.room:room-ktx:$room_version"
kapt "androidx.room:room-compiler:2.5.0-alpha01"
// kapt "org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.2.0"
// optional - RxJava2 support for Room

implementation "androidx.room:room-rxjava2:$room_version"

// optional - RxJava3 support for Room
implementation "androidx.room:room-rxjava3:$room_version"

// optional - Guava support for Room, including Optional and ListenableFuture
implementation "androidx.room:room-guava:$room_version"

// optional - Test helpers
testImplementation "androidx.room:room-testing:$room_version"

// optional - Paging 3 Integration
implementation "androidx.room:room-paging:2.5.0-alpha01"

更新1:
我的类型转换器(Converters.kt) 看起来如下:

class Converters {
    @TypeConverter
    fun uByteToInt(uByte: UByte): Int = uByte.toInt()
    @TypeConverter
    fun intToUByte(value: Int): UByte = value.toUByte()
}

and AppDatabase.kt:

@Database(entities = [<...>::class], version = 1, exportSchema = false)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
    abstract fun sensorDao(): SensorDao
    ...
}

更新2:
可能值得注意的是,该类UInt8是另一个实体中的嵌套类,即:

@Entity()
data class  simpleConfig(
    @Embedded(prefix = "simplec_version_") val version: UInt8 = 
    UInt8("Field Version"),
...)
   

我相信这很可能是一个错误。

如果您有 UInt8,那么 Room 会生成 AppDatabase_Impl,其中的表将 UByte 识别为 INTEGER,例如

_db.execSQL("CREATE TABLE IF NOT EXISTS `UInt8` (`key` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `testvalue` INTEGER NOT NULL, `size` INTEGER NOT NULL, `readOnly` INTEGER NOT NULL)");
  • 根据createAllTables method
  • 注意值已更改为测试值以确保它正在重新生成。

因此 Room 知道 UByte 等同于 INTEGER 列类型。

我认为,问题在于它处理需要 Int,因此默认的 getter 和 setter 是不够的。此外,TypeConverters 被忽略,因为 Room 显然知道如何处理。

如果您改为使用:-

@Entity
data class UInt8(
    @PrimaryKey(autoGenerate = true)
    var key: Int,
    var name: String = "uint8-test",
    var testvalue: Int = 0,
    var size: Int = 1,
    var readOnly: Boolean = true
) {
    constructor(key: Int, name: String, testvalue: UByte, size: Int, readOnly: Boolean): this(key,name, testvalue.toInt(),size,readOnly)
}

然后 Room 不会抱怨,但检索它时 testvalue 将是一个 Int 。但是,您需要重写 getter 以从 Int 返回 Ubyte。

  • see 覆盖 Kotlin 数据类的 getter https://stackoverflow.com/questions/38492103/override-getter-for-kotlin-data-class/46376746#46376746

但是,如果您创建一个类来屏蔽 Room 如何处理 UByte,并实现合适的类型转换器,那么它们就会发挥作用。

所以如果你有例如。

data class MyUByte(
    val value: UByte
)

并有:-

@TypeConverter
fun myUByteToInt(myUByte: MyUByte): Int = myUByte.value.toInt()
@TypeConverter
fun intToMyUByte(value: Int): MyUByte = MyUByte(value.toUByte())

最后:-

@Entity
data class UInt8(
    @PrimaryKey(autoGenerate = true)
    var key: Int,
    var name: String = "uint8-test",
    var testvalue: MyUByte = MyUByte(0.toUByte()),
    var size: Int = 1,
    var readOnly: Boolean = true
)

然后 TypeConverters 就不会被忽略,编译就可以了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 kotlin.UByte 作为房间实体不起作用 的相关文章

  • Android 如何使用 OkHttp 从 Callback 获取响应字符串?

    这是我的代码 OkHttpClient okHttpClient new OkHttpClient Request request new Request Builder url http publicobject com hellowor
  • Android 应用内购买

    我正在尝试开发一个停车应用程序 用户可以在其中为停车时间付费 我浏览了这份文件应用内产品 http developer android com google play billing billing overview html produc
  • 如何在 Android 中编辑 asset 文件夹中的文本文件?

    我正在使用 Android 中资产文件夹中的文本文件 我想动态更改该文本文件内的数据 我试图按如下方式打开该文件 FileOutputStream fos this getAssets openNonAssetFd data txt cre
  • OpenCV warpPerspective 性能缓慢

    在我的应用程序中 我跟踪一个物体 到达它的地方corners都在这个框架中 我发现它之间的单应性corners从最后一帧开始和 当前帧 使用单应性来做perspectiveTransform on the corners在当前帧中找到 得到
  • 如何通过单击颤动推送通知来打开特定屏幕

    我试图在单击推送通知时打开特定屏幕 我的有效负载如下所示 var payload notification title notificationTitle body notificationMessage click action scre
  • Android-无法解析符号 BaseObservable

    我正在尝试在 android 中实现数据绑定示例并使用可绑定变量创建 POJO 但我收到此错误 请帮忙 我正在关注这个教程http www vogella com tutorials AndroidDatabinding article h
  • 如何使用baseadapter自定义listview

    我想创建一个定制的ListView像这样 我想我必须使用BaseAdapter但我对此一无所知 主要 xml
  • android-透明RelativeLayout

    我想要制作一个具有可绘制渐变作为背景的活动 并将在其背景顶部显示 4 个面板 相对布局 现在我想让 4 个面板透明 例如 50 以便也可以看到渐变背景 我搜索了谷歌 但我发现只能通过活动而不是布局来做到这一点 如何做我想做的事 您可以创建一
  • 索尼 SmartWatch 2 定制表盘自固件更新后损坏

    我知道这将是这个的重复 gt SW2 更新后如何修复 Sony SmartWatch 2 上的自定义表盘时间 https stackoverflow com questions 27536415 how to fix custom watc
  • 更改图库中的边框样式

    我正在服用this http www androidpeople com android gallery imageview example 教程 正如你所看到的this http www androidpeople com wp cont
  • Android 视频循环缓冲区与声音

    我正在使用谷歌的开源示例 Grafika https github com google grafika 我正在使用它ContinuousCaptureActivity java https github com google grafik
  • RecyclerView 未按预期滚动

    我有一个项目 我使用水平回收器视图 并且我想将一个元素居中 我的实现有效 但并非在所有情况下都可以检查此 GIF 正如您可能注意到的 如果我从左边来 它会正确滚动 如果我从右边来 它会过度滚动很多 我不知道如何停止也不知道如何解决这个问题
  • Android 背景 + 文本 + 按钮图标

    我想要一个图像设置为文本的背景 并在文本的左侧设置一个图标 在iPhone中非常简单 但不知道如何在Android上做到这一点 调整按钮的大小并保持图标 文本的位置和距离正确 iPhone 安卓我有这个 xml代码是
  • listItems之间的黑线,如何删除?

    我的列表项之间有一些水平黑线 如何删除它们 我的图形没有一部分 谢谢 listview setDivider null listview setDividerHeight 0 或在 XML 中
  • SeekBar 未设置实际进度。 SetProgress() 不适用于早期的 Android 版本 [重复]

    这个问题在这里已经有答案了 我有一个应用程序 我想根据从 Web 服务检索到的值设置特定 SeekBar 的进度 但是 当我使用 SetProgress int 时 只有 SeekBar 的 搜索者 被设置 该栏未按预期 填充 它看起来是这
  • 用dagger 2查看依赖注入

    我有一个自定义视图扩展TextView 我应该在哪里调用我的组件来注入视图 component inject customTextView 因此 我发现我需要在自定义视图的构造函数中添加注入 在所有视图中 或者使一个调用另一个 Exampl
  • Firebase:获取对第一个项目/元素的引用

    我正在尝试获取对 firebase Array 中第一个项目的引用 就我而言 它会是 ElmmycgjS1Nvq albums IrdMMds 但我不确定如何构造查询 dbRef child ElmmycgjS albums child n
  • 如何从下到上连续移动图像?

    我一直在研究这个例子http obviam net index php a very basic the game loop for android http obviam net index php a very basic the ga
  • Android Mediaplayer:下载媒体文件的 setDataSource 问题

    我有一个可以录制和播放音频文件的应用程序 一些音频文件是使用 httpclient 使用简单的标准 http 下载来下载的 很长一段时间以来 它就像一种魅力 现在我突然无法播放我下载的文件 该堆栈失败 我将文件存储在 SDCard 上 并且
  • 如何获取 EC2 实例的 CloudWatch 指标数据

    我想获取我的 EC2 实例的 Cloudmetrics 数据 以便我可以使用这些数据绘制图表并将其显示在我的 Android 设备上 我怎么做 有相同的示例程序或教程吗 提前致谢 这就是我正在做的 private static void f

随机推荐