使用orderByChild().equalTo()无法获取Firebase数据的问题求助
问题分析与解决方案
首先,orderByChild结合equalTo的思路是完全正确的,你遇到的两个问题(无法获取数据、索引提示)都有明确的原因,咱们一步步来解决:
1. 为什么equalTo(Storename)无法生效?
核心原因是字段名大小写不匹配:
- 你的查询代码里用的是
orderByChild("storename")(小写s开头),但从你的Firebase数据截图能看到,数据库里的字段键是Storename(大写S开头)。Firebase的节点键是严格区分大小写的,这就导致查询找不到对应的数据,自然返回空结果。
修复方案:统一字段名大小写
你有两种选择,推荐第一种(更符合命名规范):
- 方案一:统一为小写
storename- 修改Firebase数据库中所有
FoodInfo节点的键,把Storename改成storename; - 检查你写入数据到Firebase的代码,确保实体类的
storename字段被正确写入(你的实体类已经是小写的storename,大概率是写入时的代码写错了字段名); - 保持查询代码的
orderByChild("storename")不变。
- 修改Firebase数据库中所有
- 方案二:修改查询语句匹配数据库字段
直接把查询里的orderByChild("storename")改成orderByChild("Storename"),和数据库的键保持一致。
另外,记得用Log打印一下从上个页面传过来的StoreName变量值,确认它和数据库里的店铺名称完全一致(包括大小写、空格等细节),避免因传值错误导致匹配失败。
2. 如何解决Firebase的索引提示?
这个提示是因为Firebase需要为你查询的字段建立索引来提升性能,按照提示修改数据库规则即可:
如果是统一成小写storename,修改后的规则如下:
{ "rules": { ".read": "auth != null", ".write": "auth != null", "FoodInfo": { ".indexOn": "storename" } } }
如果选择保留大写Storename,则把.indexOn的值改成"Storename"即可。
完成以上修改后,你的查询应该就能正确获取到匹配店铺名称的FoodInfo数据了。
内容的提问来源于stack exchange,提问作者Choy
相关产品推荐
相关产品推荐

