Firebase查询特定时间起始消息异常:仅返回单条数据求助
Firebase聊天消息查询:仅返回单条消息的问题排查
看起来你遇到了明明数据库里有符合时间条件的多条消息,但查询只返回单条的情况,咱们一步步来梳理问题:
首先看你的查询代码:
[[[_conversationDBRef queryOrderedByChild:@"time"] queryStartingAtValue:@(time)] observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) { for (FIRDataSnapshot* child in snapshot.children) { NSDictionary* msgData = child.value; NSLog(@"msgData: %@", msgData); } }];
再看调试信息里的查询参数:
(lldb) po [[_conversationDBRef queryOrderedByChild:@"time"] queryStartingAtValue:@(time)] (/Strike-Fighter/messages/4_5 { i = time; sp = "548914514.2122542"; })
你的数据库数据截图:
核心问题:数据类型不匹配
Firebase的查询是严格匹配数据类型的。从调试信息里sp = "548914514.2122542"(带引号的字符串格式)可以推测:你数据库里的time字段是字符串类型,但查询时传入的是@(time)——一个NSNumber数字类型。
这种类型不匹配会导致Firebase无法正确匹配所有符合数值条件的记录,只能返回刚好类型和值完全一致的那条(如果存在的话)。
解决办法
确认数据库字段类型
登录Firebase控制台,查看Strike-Fighter/messages/4_5节点下的消息,检查每个消息的time字段是数字(蓝色标识)还是字符串(黑色带引号标识)。统一查询与存储的类型
- 如果
time是字符串类型:修改查询代码,把起始值转换成对应格式的字符串:// 将数字time转为匹配数据库格式的字符串 NSString *timeStr = [NSString stringWithFormat:@"%.7f", time]; [[[_conversationDBRef queryOrderedByChild:@"time"] queryStartingAtValue:timeStr] observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) { for (FIRDataSnapshot* child in snapshot.children) { NSDictionary* msgData = child.value; NSLog(@"msgData: %@", msgData); } }]; - 如果
time应该是数字类型:检查你写入消息到Firebase的代码,确保把time存为NSNumber而非NSString,之后再用原有的数字查询逻辑即可。
- 如果
控制台测试验证
可以在Firebase控制台的数据库页面,使用「查询」功能手动测试:选择按time排序,输入对应类型的起始值,看看是否能返回所有预期的消息,这样能快速验证查询逻辑是否正确。
内容的提问来源于stack exchange,提问作者TienLe
相关产品推荐
相关产品推荐

