Java 如何确切地知道从Firebase数据库获取数据时未能转换其值的属性

Java 如何确切地知道从Firebase数据库获取数据时未能转换其值的属性,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我能知道下一个数据库异常发生时,属性转换值失败的确切原因吗?当您处理包含嵌套其他节点的大节点时,很难捕获属性 W/System.err:com.google.firebase.database.DatabaseException: 无法将java.lang.String类型的值转换为double 异常发生在第29行 "delivery_fees": "9" 发生错误的下一个代码段数据库结构 { ... “交付到期日”:“09-08-2018 14:32:55”, “交货日”:“星期二”, “

我能知道下一个数据库异常发生时,属性转换值失败的确切原因吗?当您处理包含嵌套其他节点的大节点时,很难捕获属性

W/System.err:com.google.firebase.database.DatabaseException: 无法将java.lang.String类型的值转换为double

异常发生在第29行

"delivery_fees": "9"
发生错误的下一个代码段数据库结构

{
...
“交付到期日”:“09-08-2018 14:32:55”,
“交货日”:“星期二”,
“交货时间”:“2018-05-29 14:12:11”,
“交付费用”:“9”,
“交货\付款\类型”:“使用现金”,
“交付开始时间”:“2018-05-29 12:12:11”,
...

}
您将获得以下代码行:

W/System.err: com.google.firebase.database.DatabaseException: Failed to convert a value of type java.lang.String to double
因为我在数据库架构中看到的
delivery\u fees
属性是
String
类型,而不是
double
类型。因此,当您试图将其值转换为
double
时,您会遇到这样一个错误,即它无法转换,这实际上是正确的,因为您无法在Java中将字符串对象简单地转换为double


有两种方法可以解决这个问题。第一种方法是将
delivery\u fees
属性的值作为字符串获取,然后将其转换为double。第二种方法是将属性的类型更改为double,
“交付费用”:“9”
->
“交付费用”:9.01
,并保持获取方法不变。第二种方法也是我推荐的,因为属性需要保存相应数据类型的值。通过这种方式,您可以利用数字提供的功能。

如果要确保字段具有所需的类型,请在firebase数据库上设置规则,将字段限制为一种类型。在您的例子中,所发生的情况是,您期望从数据库中得到一个整型/长型值,但它将作为字符串写入数据库

试图抓住客户端的期望是不理想的。理想的解决方案是限制字段可以接受的数据

以下是规则简介:

下面是firebase团队的一个简单工具,可以轻松编写规则


这看起来可能是一个很长的解决方案,但这是一种让客户端不必猜测字段类型的写入方式。

请添加您的数据库结构并指出发生此错误的行。@AlexMamo感谢您的重播,我已经能够找到失败的属性,但这需要我花很多时间搜索一般错误消息,因此我想知道是否有任何方法可以直接选择失败的属性。这就是为什么我要求您添加结构并指出发生此错误的行,以便我可以告诉您确切的属性。@Alexmam您现在可以检查它吗,我正在更新问题并添加数据库结构。您用于写入firebase数据库的代码在哪里?感谢您抽出时间,但这不是我要查找的,我已经知道异常位置并修复了它。我想知道的是如何知道“交货费用”是一个失败的参数,而不需要搜索所有节点属性?您的异常中没有此详细信息。换句话说,
DatabaseException
对象并不包含它出现的属性的实际名称,它只指示代码中它出现的行,然后根据它,您可以从数据库中获取名称。另一种方法是使用安全规则并相应地限制每个属性。对于编写安全规则,我认为最好的解决方案是用更高级的语言编写规则,并编译成Firebase安全规则。最著名的是(他们的祖父),(不是来自Firebase本身)和(新的,正在积极开发中)。据我所知,Bolt是一个只进行研究的项目,学习该语言已被纳入firebase存储安全规则,没有官方支持。@devqmr Hi devqmr!您尝试过我上面的解决方案了吗?我将致力于将安全角色添加到firebase数据库,对于我的问题,我认为答案是否定的。谢谢您的建议,我同意您的意见,但是,我的问题是,是否有任何方法可以知道到底哪些属性失败了。不仅仅是一般的异常消息,您的错误很可能是在从快照提取值并分配给变量时发生的,因此错误是由于错误的数据类型造成的,并且错误被包装在DatabaseException中,因为代码是在值事件侦听器中执行的。因此,您必须手动调试并查找错误。这就是为什么我建议从规则中控制它。