无法将字符串转换为数据类对象 - Firebase 实时数据库 [重复]

Posted

技术标签:

【中文标题】无法将字符串转换为数据类对象 - Firebase 实时数据库 [重复]【英文标题】:Can't convert String to data class objects - Firebase realtime database [duplicate] 【发布时间】:2021-07-20 02:29:51 【问题描述】:

我在同一问题上阅读过其他 cmet,但没有一个涉及像我这样的情况

在我看来,下面描述了数据的结构:


   "symbols":
      "alphabets":
         "a":
            "available":true,
            "text":"A",
            "timestamp":1.512686825309134E9
         ,
         "b":
            "available":true,
            "text":"B",
            "timestamp":1.512687248764272E9
         "NameOfSymbols":"alphabets"
      
   

*我的显示错误的原因是它无法将字符串"NameOfSymbols" : "alphabets"转换为数据类中指定的对象

那么,有什么办法呢,我用的是 Kotlin

有没有一种方法可以排除子值的那一部分,而我只得到数据类中指定的值?

数据类

data class alphabets(
    val name: Names,
var NameOfSymbols: String? = null) 
    data class Names(

        var available: Boolean? = null,
        var text: String? = null,
        var timestamp: Long? = null) 

    

【问题讨论】:

如果没有您的代码,您怎么能指望我们在您的代码中为您提供帮助?共享您创建的数据类。 是的,您可以通过不在数据类中声明它们来很好地排除您不想要的字段。 我没有声明字符串,我只声明了对象 我已经添加了数据类 我尝试格式化您的 JSON,但 NameOfSymbols":"alphabets 似乎不是其中的一部分。请编辑您的问题并直接从控制台将您的数据库结构添加为 JSON 文件?您可以通过单击 Firebase Console 的溢出菜单 (⠇) 中的导出 JSON 来简单地获取它。 【参考方案1】:

这种结构可能适用于您的情况(未经测试):

data class Message(
    @PropertyName("symbols") val symbols: Symbols,
)

data class Symbols(
    @PropertyName("alphabets") val alphabets: Alphabets,
)

data class Alphabets(
    @PropertyName("a") val a: Alphabet,
    @PropertyName("b") val b: Alphabet,
    @PropertyName("NameOfSymbols") val nameOfSymbols: String,
)

data class Alphabet(
    @PropertyName("available") val available: Boolean,
    @PropertyName("text") val text: String,
    @PropertyName("timestamp") val timestamp: Long,
)

用法如下:

// in your ValueEventListener
override fun onDataChange(snapshot: DataSnapshot) 
    val value = snapshot.getValue<Message>()

如果你想排除你的NameOfSymbols,你应该删除它,然后添加@IgnoreExtraProperties,如下所示:

@IgnoreExtraProperties
data class Alphabets(
    @PropertyName("a") val a: Alphabet,
    @PropertyName("b") val b: Alphabet,
)

注意,我使用了这些版本的 firebase 数据库:

implementation 'com.google.firebase:firebase-database:19.7.0'
implementation 'com.google.firebase:firebase-database-ktx:19.7.0'

【讨论】:

哇,这可能行得通,等我装上电脑去看看 请问,我怎样才能将它与我的数据类联系起来? (我在上面添加了我的数据类)它们看起来完全不同,并且用于从数据库中读取数据的大部分值都是从上一个屏幕传递的道具,所以有没有办法可以将这些变量带入属性中名称参数【参考方案2】:

好的,在阅读了 firebase 文档网站上关于结构化数据库的文档后,Structure your database

我意识到我没有很好地构建我的数据库,我应该在指定名称后重新组合它们 如下所示


  // This is a poorly nested data architecture, because iterating the children
  // of the "chats" node to get a list of conversation titles requires
  // potentially downloading hundreds of megabytes of messages
  "chats": 
    "one": 
      "title": "Historical Tech Pioneers",
      "messages": 
        "m1":  "sender": "ghopper", "message": "Relay malfunction found. Cause: moth." ,
        "m2":  ... ,
        // a very long list of messages
      
    ,
    "two":  ... 
  

虽然它说这样构造它不是一个好方法,但似乎这对我有用

【讨论】:

以上是关于无法将字符串转换为数据类对象 - Firebase 实时数据库 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

解决一堆承诺时出现 Firebase 错误:无法将未定义或 null 转换为对象

Firebase 函数 - 发送推送并收到错误消息“TypeError:无法将未定义或 null 转换为对象”[关闭]

com.google.firebase.database.DatabaseException:无法将 java.lang.String 类型的值转换为 long

com.google.firebase.database.DatabaseException:无法将 java.lang.String 类型的对象转换为 com.example.gatewayrest

我得到了这个错误,但我无法解决它。 com.google.firebase.database.DatabaseException:无法将 java.lang.String 类型的对象转换为类型

com.google.firebase.database.DatabaseException:无法将 java.lang.String 类型的对象转换为 com.example.prj.User 类型