Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.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-对recyclerview(Firebase)的多个查询_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android-对recyclerview(Firebase)的多个查询

Android-对recyclerview(Firebase)的多个查询,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我与RecylerView和Firebase合作。我正在使用FirebaseUI将数据填充到我的recyclerview中。我想知道是否可以在我的片段中使用两个查询。应执行的查询应取决于数据库中是否存在节点 数据库结构: 如果地址子节点出现在用户节点中,我的片段应该查询用户节点。如果不是,它应该查询routes节点。这可能吗 基本上,我在这里通过查询获得所有标记: Query keyQuery = FirebaseDatabase.getInstance().getReference(shar

我与RecylerView和Firebase合作。我正在使用FirebaseUI将数据填充到我的recyclerview中。我想知道是否可以在我的片段中使用两个查询。应执行的查询应取决于数据库中是否存在节点

数据库结构:

如果地址子节点出现在用户节点中,我的片段应该查询用户节点。如果不是,它应该查询routes节点。这可能吗

基本上,我在这里通过查询获得所有标记:

Query keyQuery = FirebaseDatabase.getInstance().getReference(sharedPreferences.getString("school", null)).child("markers");
    recyclerView = (RecyclerView) rootView.findViewById(R.id.markerRecyclerview);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

    FirebaseRecyclerOptions<FirebaseMarker> options = new FirebaseRecyclerOptions.Builder<FirebaseMarker>()
            .setQuery(keyQuery, FirebaseMarker.class)
            .build();

我在想:如果在用户节点中插入一个地址时间节点,我就可以查询它,这样会更简单。

这是可能的,尽管我认为您首先需要检查用户是否选择了标记,然后决定将哪个查询附加到
FirebaseRecyclerAdapter

为此,可能需要添加已在标记节点下选择每个标记的用户列表,如:

users
  userId
    selectedMarker      // the ID of the marker selected by this user
    ...
markers
  markerId
    ...
    selectedUsers       // list of user IDs that have selected this marker
然后,如果
users
节点包含
selectedMarker
值,则可以使用以下查询获取此特定用户选择的所有标记:

Query query = FirebaseDatabase.getInstance().getReference()
        .child(schoolId).child("markers")
        .orderByChild("selectedUsers/"+userId).equalTo(true);
其中
schoolId
来自您的
SharedReferences。getString(“school”,null)
userId
是当前登录用户的唯一ID

要检查用户是否选择了标记,可以简单地执行以下操作:

FirebaseDatabase.getInstance().getReference()
        .child(schoolId).child("users").child(userId)
        .addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.child("selectedMarker").exists()) {
                    // Attach above query to FirebaseRecyclerAdapter
                } else {
                    // Attach markers reference (no query) to FirebaseRecyclerAdapter
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {}
        });

但是,如果您只想显示用户选定的单个标记,则可能根本不需要使用
RecyclerView
,只需使用单独的视图来显示用户选定标记的详细信息。

,根据当前用户的节点下是否存在
地址
,是否要将不同的查询附加到
FirebaseRecyclerAdapter
?你能提供一些例子代码说明在哪里会发生这种情况吗?您应该可以使用不同的
FirebaseRecyclerOptions
实例初始化适配器。我已经更新了我的帖子。这有意义吗?你认为可能吗?谢谢你的回答。您的最后一点似乎是正确的,因为我只需要显示用户的单个选定标记。我想使用
recylerview
来显示所有标记,如果用户节点下存在
address
节点,则只显示一个单独的文本视图。我遇到的问题是,当在
if else
语句中运行数据库引用时,它没有正确执行。。我就是这样做的。我犯了什么错误吗。我的屏幕只显示了一个填充的行,没有数据。这看起来不错,但您需要记住,
onDataChange()
是异步的,因此如果您还没有调用,
FirebaseRecyclerOptions
设置代码,则需要在该块中调用
else语句中的设置代码?这一切都是用同样的方法完成的
FirebaseDatabase.getInstance().getReference()
        .child(schoolId).child("users").child(userId)
        .addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.child("selectedMarker").exists()) {
                    // Attach above query to FirebaseRecyclerAdapter
                } else {
                    // Attach markers reference (no query) to FirebaseRecyclerAdapter
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {}
        });