Firebase Android:未知时间戳键下如何读取坐标值?
解决Firebase动态时间戳键下的POJO转换与坐标读取问题
这个问题我之前帮不少开发者踩过坑——你用limitToLast(1)拿到的DataSnapshot顶层是个以动态时间戳为键的对象,而POJO需要固定的属性名,直接转自然会失败。给你两个简单可行的方案:
方案一:遍历子节点(最直观)
因为你用了limitToLast(1),所以返回的DataSnapshot里只会有一个子节点,直接遍历它的子节点就能拿到你要的坐标对象:
// 假设你已经获取到了目标DataSnapshot DataSnapshot latestSnapshot = ...; // 遍历子节点(这里只会循环一次) for (DataSnapshot childNode : latestSnapshot.getChildren()) { // 把子节点的值转成你的坐标POJO CoordinatePOJO coordinate = childNode.getValue(CoordinatePOJO.class); // 现在就能读取坐标了,比如: double latitude = coordinate.getLatitude(); double longitude = coordinate.getLongitude(); }
方案二:用Map接收动态键
如果不想用循环,也可以把整个结构当成Map来处理,键是时间戳字符串,值是你的坐标POJO:
DataSnapshot latestSnapshot = ...; // 用GenericTypeIndicator来指定Map的泛型类型 GenericTypeIndicator<Map<String, CoordinatePOJO>> typeIndicator = new GenericTypeIndicator<Map<String, CoordinatePOJO>>() {}; Map<String, CoordinatePOJO> coordinateMap = latestSnapshot.getValue(typeIndicator); // 取Map里的第一个值(因为limitToLast(1)只有一个元素) CoordinatePOJO latestCoordinate = coordinateMap.values().iterator().next(); // 读取坐标 double lat = latestCoordinate.getLatitude(); double lng = latestCoordinate.getLongitude();
补充说明
两种方案的核心都是跳过顶层的动态时间戳键,直接获取其对应的子节点值——这才是你真正需要转成POJO的坐标对象。只要你的CoordinatePOJO的属性和Firebase里坐标对象的字段名对应(或者用@PropertyName注解映射),转换就不会有问题。
内容的提问来源于stack exchange,提问作者Filipe Ramos
相关产品推荐
相关产品推荐

