firebase db:具有 Kotlin 委托属性的模型

2024-01-09

我正在使用 Kotlin 对象来处理我的 Firebase 数据库模型,如上所述在指南中 https://firebase.google.com/docs/database/android/read-and-write#basic_write。我有许多存储为字符串的字段,但实际上是枚举,因此为了类型安全,我在模型中有枚举字段,再加上一个返回 firebase 存储值的字符串委托属性(如建议的那样)我问的一个问题 https://stackoverflow.com/questions/41651507/firebase-clean-way-for-using-enum-fields-in-kotlin-java前一段时间)。现在,如果我在代码中获取/设置字符串委托,这些字段就可以工作,但在与数据库的 json 格式进行转换时,firebase 库似乎会跳过它们。

一个简单的例子:

abstract class BaseModel {
    @Exclude
    open var path: String? = null  // fails even if I delete this field!
}

class Weight() : BaseModel() {
    constructor(v: Double, u: WeightUnit) : this() {
        value = v
        unitEnum = u
    }

    var value: Double = 0.0
    @Exclude
    var unitEnum: WeightUnit = WeightUnit.KG
    var unit: String by EnumStringLowercaseConverter(WeightUnit::class.java).getDelegate(Weight::unitEnum)

}

[...]
val testWeight = Weight(7.0, "kg")
db.getReference("/valid/path/to/save/testWeight").setValue(testWeight)
            .addOnSuccessListener { r -> Log.d(LOG_TAG, "set successful") }
            .addOnFailureListener { e -> Log.e(LOG_TAG, "set error", e) }

The setValue总是给出一个Permission Denied错误,但如果我删除则有效unitEnum字段并制作unit一个正常的String财产。

这与阅读类似:Firebase在获取Weight对象时没有给出错误,但是weightUnit字段永远不会设置为默认值以外的任何值。但是,如果我手动执行weight.unit = "lb", the unitEnum字段正确返回WeightUnit.LB.

我正在使用 firebase libs v10.0.1

现在,问题是:

  • 我该怎么做才能使委托属性与 firebase 一起正常工作?我可以尝试对委托枚举字段采用不同的方法,只要来自我原来的问题 https://stackoverflow.com/questions/41651507/firebase-clean-way-for-using-enum-fields-in-kotlin-java满意(可读、简洁且类型安全的代码)。
  • 有什么办法可以看看如何exactlyfirebase libs 是否将对象与 json 相互转换?或者至少看到转换后的 json?也许那时我可以自己调整一些东西。不幸的是,所有与 firebase 相关的内容都显示为/* compiled code */在 Android Studio 中。

UPDATE: 我当然可以添加一个toMap()方法到每个模型,我将构建一个包含 firebase 中所需的所有属性的映射,但是为每个模型执行此操作会很烦人,并且它仅解决了保存问题,在获取时仍然不会设置枚举字段。

使用 GSON 序列化时也会跳过委托的 props。那么也许有一种通用方法可以使委托属性看起来像常规字段吗?


试试这个代码,它应该可以工作。

@get:Exclude @set:Exclude
var unitEnum: WeightUnit = WeightUnit.KG
var unit: String
    get() = unitEnum.name
    set(v) { unitEnum = WeightUnit.valueOf(v) }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

firebase db:具有 Kotlin 委托属性的模型 的相关文章

随机推荐

  • 在参数中使用通配符

    在snakemake中使用config yaml文件定义参数时是否可以使用通配符 我使用通用 R 脚本来制作相同的基本热图 但使用不同的输入矩阵 我想使用通配符为 config yaml 文件中的每个热图指定热图的配置 例如 K 均值聚类的
  • 为什么自定义 DialogPreference 不会在 onSharedPreferenceChanged 侦听器上触发?

    我正在尝试在首选项中设置对话框首选项 用户只需单击肯定按钮即可触发某些操作 清除数据库 否 是 public class MyDialogPreference extends DialogPreference public MyDialog
  • 错误 D8016:“/ZI”和“/clr”命令行选项不兼容

    我的程序中出现以下错误 error D8016 ZI and clr command line options are incompatible 当我添加以下几行并在配置 gt 常规中启用公共运行时时会发生这种情况 如果我不启用它 则在使用
  • 错误:用户 ''@'localhost' 的访问被拒绝(使用密码:NO)

    我正在尝试使用 MySQL 和 Knex 进行数据库迁移 当我运行命令时knex migrate latest I get ER ACCESS DENIED ERROR Access denied for user localhost us
  • 使用 Node 提供 Vue 应用程序时,构建会导致空 HTML 页面出现语法错误

    我使用 CLI 创建了一个 VueJs 页面 我想在没有安装 Vue CLI 或 Node 的情况下向其他人展示它 就像您通常在浏览器中打开 html 文件一样 我想在构建后打开 index html 文件 当我打开该文件时 我在控制台中看
  • Postgres 中的 Group by 子句中有多个不需要的记录

    我有两张桌子 我将它们连接在一起 然后运行group by条款 问题是我不断收到不需要的数据 client table name company id created at company table name Query SELECT c
  • 使用 VSCode 调试 Celery

    我在用VSCode https code visualstudio com 用于使用 Django 框架进行 Web 开发 调试 Django 没有任何问题 但是当我尝试使用Celery http docs celeryproject or
  • Noob file.copy 问题在复制 .exe 文件 C# 时遇到问题

    我试图将 exe 文件从临时目录复制到桌面 但是当我这样做时 它只是创建一个新的 exe 文件 其中没有数据 大小为 0 KB 我用 txt 文件测试了这个语法 它完全复制了它 只是由于某种原因拒绝复制 exe 文件 我尝试使用string
  • 将颜色声明为常量

    我怎样才能申报Color输入为const像这样 private const Color MyLovedColor Color Blue 这不起作用 因为 Color Blue 是静态的而不是常量 只读对我没有帮助 因为我需要仅 支持 常量的
  • 纬度返回 0,0

    我正在尝试创建一个显示我当前位置的应用程序 我拥有所有必要的许可 我有另一个类名称 GPS 跟踪器来获取我的 GPS 位置 这是我的代码 GPSTracker gpsTracker new GPSTracker this LocationM
  • Nexus 7 上的 Android 4.2:canvas.drawText() 无法正常工作

    我的应用程序面临严重问题 该应用程序发布在 Google Play 上 并且显然在除 gt 4 0 之外的所有 Android 版本上都运行良好 这是我的 Android 4 0 HTC 手机的屏幕截图 这是我在 Nexus 7 Andro
  • 在 Sweetalert 上显示成功消息通知

    我想显示使用 Sweetalert 成功删除数据的消息以及脚本的开头 a href class delete link Delete a JavaScript jQuery document ready function delete li
  • 创建自定义大通知

    我想创建一个包含一些控件的通知 由于文本和控件在默认通知大小 64dp 下都很小 因此我希望它比默认大小更大 可以创建更大的通知 我认为也可以有自定义布局 但我不知道如何 To be more specific the following
  • Clojurescript:错误:无法找到或加载主类 clojure.main

    我按照它安装了 Clojurescript快速入门指南 https github com clojure clojurescript wiki Quick Start 我将 git 存储库拉到 clojurescript CLOJURESC
  • SwiftUI @State var 初始化问题

    我想初始化 a 的值 StateSwiftUI 中的 var 通过init 的方法Struct 因此它可以从准备好的字典中获取正确的文本 以便在 TextField 中进行操作 源代码如下所示 struct StateFromOutside
  • $_GET 。未定义的变量。找不到解决方案[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我遇到了问题并且没有想法 我试图从 URL 获取参数 但 PHP 坚持说该变量未定义 网址是 http localhost tre
  • Twitter Bootstrap 中的响应式表处理

    当表格的宽度超过跨度的宽度时 就像这个页面 http jsfiddle net rcHdC http jsfiddle net rcHdC 您将看到表格的内容超出了span 解决这种情况的最佳方法是什么 引导程序3 http blog ge
  • 如何在 AngularJS 指令中的元素上绑定滚动事件

    如何在 AngularJS 指令中的元素上绑定滚动事件 我在 window 上绑定滚动 但现在我需要将其更改为此类 body wrapper angular element document queryselector body wrapp
  • 如何将 pandas 数据框逐行写入 CSV 文件,一次一行?

    我有一个大约 100 万个地址的列表 以及一个查找它们的纬度和经度的函数 由于某些记录的格式不正确 或出于任何原因 有时该函数无法返回某些地址的纬度和经度 这将导致 for 循环中断 因此 对于成功检索到纬度和经度的每个地址 我想将其写入输
  • firebase db:具有 Kotlin 委托属性的模型

    我正在使用 Kotlin 对象来处理我的 Firebase 数据库模型 如上所述在指南中 https firebase google com docs database android read and write basic write