Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-从Firebase查询数据_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android-从Firebase查询数据

Android-从Firebase查询数据,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我想在我的Firebase实时数据库中查询并显示在我的Recyclerview中的数据,但我不知道如何做到这一点 数据库结构: 对于一个活动,我只想查询markers节点使用FirebaseUI似乎很容易做到这一点 对于另一个活动,我想查询所有路线和所有标记。因此,我的recyclerview中的每一行都包括:一条路线的开始目的地和结束目的地,连接到该路线的标记的地址和时间这是我之前答案的后续内容,因此我将尽力为您提供一些示例 创建可缩放的数据 这里的基本前提是,在显示路由列表时,您希望尽量避

我想在我的Firebase实时数据库中查询并显示在我的Recyclerview中的数据,但我不知道如何做到这一点

数据库结构:

对于一个活动,我只想查询markers节点使用FirebaseUI似乎很容易做到这一点


对于另一个活动,我想查询所有路线和所有标记。因此,我的recyclerview中的每一行都包括:一条路线的开始目的地和结束目的地,连接到该路线的标记的地址和时间

这是我之前答案的后续内容,因此我将尽力为您提供一些示例

创建可缩放的数据 这里的基本前提是,在显示路由列表时,您希望尽量避免下载与路由标记关联的所有数据。这是因为此时您不需要了解有关标记的所有信息,只需要了解部分细节

此外,从数据库(通过网络)下载的用于显示路由列表的数据越少,生成该列表的速度就越快。例如,假设您有1000条路线,每条路线有10个标记;这意味着只需下载1000条路线和10000个标记即可显示路线列表

这就是为什么要创建可扩展的数据,并且还建议在NoSQL数据库中创建和复制数据

重复数据 因此,为了快速方便地获得与特定路由相关联的可用标记列表,您需要开始在路由节点上存储标记地址和时间,就像您使用标记ID一样

一种可能的解决方案是创建一个额外的
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; }
}
然后在你的
路线
课程下绘制一张
地图

public Route {
    // ...

    private HashMap<String, PartialMarker> partialMarkers = new HashMap<>();

    public HashMap<String, PartialMarker> getPartialMarkers() { return partialMarkers; }
}
然后,当您将
路线
绑定到
回收视图
中的
视图持有者
时,您可以迭代每个
PartialMarker
,在该行上显示它们的列表:

for (PartialMarker partialMarker : model.getPartialMarkers().values()) {
    // ...
}
结论
您可以用其他任何方法来实现这一点,但我希望这能让您深入了解使用非规范化数据实现这一点的可能方法。一开始很难理解,因为复制数据似乎是倒退的,但这是NoSQL数据库的建议模式,当您开始处理大量数据时,这是有意义的。

谢谢您的回答。
partialMarkers.push
是一个hashmap引用,因为partialMarkers没有可用的push方法吗?我假设你的意思是
put
Oops对不起,是的,应该是
put()
要添加到
Map
,我混淆了映射和引用!我认为它几乎能起作用。我已经完成了查询的最后一部分,但是我得到了一个异常:
NullPointerException:尝试在空对象引用上调用虚拟方法“java.util.Collection java.util.HashMap.values()”。我在这个pastebin的第87行得到了这个错误:这可能是因为并非所有的路由在数据库中都有
partialMarkers
值,所以您可能希望初始化
Route
类中的
HashMap
以避免这个错误,请参阅我的编辑。不过有一个小问题。例如,当我向地图添加5个标记时,partialMarkers节点仅显示4个。当我添加3个标记时,partialMarkers节点下只有2个子节点。它总是缺少一个。
for (PartialMarker partialMarker : model.getPartialMarkers().values()) {
    // ...
}