我的Firebase实时数据库中有数据要查询并在我的Recyclerview中显示,但我对如何执行此操作感到困惑。
数据库结构:
对于一项活动,我只想查询标记节点。 这似乎很容易使用FirebaseUI
对于其他活动,我想查询所有路线和所有标记。所以我的recyclerview中的每一行都包含:一条路线的startDestination和endDestination,连接到该路线的标记的地址和时间
答案 0 :(得分:1)
这有点依据我之前的回答here和here,所以我会尽力为您提供一些示例。
这里的基本前提是您希望在显示路线列表时尽量避免下载与路线标记相关的所有数据。这是因为此时您不需要了解有关标记的所有信息,只需要部分详细信息。
此外,您从数据库(通过网络)下载的数据越少,以显示路径列表,此列表的编写速度就越快。想象一下,例如,你有1000条路线,每条路线有10个标记;这意味着下载1000条路线和10000条标记只是为了显示路线列表。
这就是为documentation suggests using data fanout创建可扩展的数据并将其推荐到denormalize并在NoSQL数据库中复制数据的原因。
因此,为了快速轻松地获取与特定路径关联的可用标记列表,您将要开始在路径节点上存储标记地址和时间,就像您使用标记ID一样。 / p>
一个可能的解决方案是创建一个额外的PartialMarker
类,该类包含有关在路由列表上使用的标记的有限信息:
public class PartialMarker {
private String address;
private String time;
public PartialMarker() {}
public PartialMarker(String address, String time) {
this.address = address;
this.time = time;
}
public String getAddress() { return address; }
public String getTime() { return time; }
}
然后在Map
课程中有Route
个这些:
public Route {
// ...
private HashMap<String, PartialMarker> partialMarkers = new HashMap<>();
public HashMap<String, PartialMarker> getPartialMarkers() { return partialMarkers; }
}
因此,当您为路径的数据库保存新标记时,您还将为每个标记创建一个PartialMarker
实例并将其保存到路径节点,如:
public void saveToDatabase() {
// Do your thing to save the route
// Create some partial markers
HashMap<String, Object> partialMarkers = new HashMap<>();
for (Map.Entry<String, Object> entry : markers.entrySet()) {
String key = entry.getKey();
FirebaseMarker marker = (FirebaseMarker) entry.getValue();
partialMarkers.put(key, new PartialMarker(marker.getAddress(), marker.getTime()));
}
// Store the partial markers under the route
schoolReference.child("routes").child(routeId).child("partialMarkers").updateChildren(partialMarkers);
}
然后,当您将Route
绑定到ViewHolder
中的RecyclerView
时,您可以遍历每个PartialMarker
以在该行上显示它们的列表:< / p>
for (PartialMarker partialMarker : model.getPartialMarkers().values()) {
// ...
}
您可以通过其他方式执行此操作,但我希望这可以让您深入了解使用非规范化数据实现此目的的可能方法。起初很难理解,因为重复数据似乎是倒退的,但这是NoSQL数据库的建议模式,当你开始处理大量数据时它是有意义的。