Firebase Realtime Database使用equalTo传Long值查询报错如何解决?
问题解决方法
报错原因
Firebase Realtime Database 的 equalTo() 方法仅开放了 Boolean、Double、可空 String 三种参数类型的重载,不支持直接传入 Long 类型参数,因此会触发类型不匹配的编译报错。setValue() 方法可以正常写入 Long 类型,是因为该方法的入参类型为 Any?,SDK 会自动将 Kotlin 的 Long 类型映射为 Firebase 支持的数值类型存储,不存在参数类型限制。
解决方法
方案1:直接转Double适配(适合条码数值不超过16位的场景)
如果你的条码数值长度小于16位,转Double不会出现精度丢失,直接将查询参数转为Double即可,修改后的代码如下:
database.getReference(verifiedProductsDb.dbPartVerifiedProducts) .orderByChild(verifiedProductsDb.barcode) .equalTo(b.toLong().toDouble()) .get() .addOnCompleteListener { // 原有业务逻辑 }
方案2:统一用String类型存储查询(更推荐)
条码本身不需要做数值运算,且如果条码长度超过16位,转Double会出现精度丢失问题,建议你将条码字段统一改为String类型存储、查询:
- 修改写入逻辑,存储条码的字符串形式:
// 写入条码时调用toString()转成字符串 reference.child(verifiedProductsDb.barcode).setValue(barcodeValue.toString())
- 修改查询逻辑,直接传入字符串类型的条码:
database.getReference(verifiedProductsDb.dbPartVerifiedProducts) .orderByChild(verifiedProductsDb.barcode) .equalTo(b.toString()) .get() .addOnCompleteListener { // 原有业务逻辑 }
内容的提问来源于stack exchange,提问作者Atom
相关产品推荐
相关产品推荐

