【问题标题】:How do you use Data Snapshot to retrieve data across multiple child nodes?如何使用数据快照跨多个子节点检索数据?
【发布时间】:2018-08-21 11:57:48
【问题描述】:

我想检索在每个 userID 节点中找到的 eventName 和 eventSport 值。

我还是 Android Studio 的新手。

我的 firebase 数据库由以下人员组织:

fir-login-31***
 event
  userID(retrieved from firebase authentication)
    Unique EventID(randomly generated by me)
      eventID: "Unique EventID
      eventName: "Test1
      eventSport: "TestSport12

因为每次不同的用户将数据上传到数据库时,数据都会存储在来自 Firebase 身份验证的 Firebase UserID 节点中。有没有办法让我仍然从每个用户生成的节点检索数据,同时仍然让用户通过他们自己的 UserID 存储他们的数据? 我使用他们的用户 ID 在 FirabaseDatabase 中设置读写规则。

Host_Activity.java:

package com.example.songkwongwee.myapplication;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.Toast;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;
import java.util.List;

public class HostActivity extends AppCompatActivity {

    EditText editTextName;
    Button buttonAdd;
    Spinner spinnerSports;

    DatabaseReference databaseEvent;
    FirebaseAuth mAuth;

    ListView listViewEvents;

    List<Event> eventList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_host);

        databaseEvent = FirebaseDatabase.getInstance().getReference("event");

        mAuth = FirebaseAuth.getInstance();

        editTextName = findViewById(R.id.editTextName);
        buttonAdd = findViewById(R.id.buttonHostGame);
        spinnerSports = findViewById(R.id.spinnerSports);

        listViewEvents = findViewById(R.id.listViewEvents);

        eventList = new ArrayList<>();

        buttonAdd.setOnClickListener(new View.OnClickListener() {   //click button method for adding event
            @Override
            public void onClick(View v) {
                addEvent();
            }
        });

    }

    @Override
    protected void onStart() {
        super.onStart();

        databaseEvent.addValueEventListener(new ValueEventListener() { //executed every time we change anything in database
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {   //contains all data in snapshot data object

                eventList.clear(); //clear artist list

                for(DataSnapshot eventSnapshot: dataSnapshot.getChildren()){
                    Event event = eventSnapshot.getValue(Event.class);

                    eventList.add(event); //every time new data entered, this method executes,fetch all artist from database
                }

                EventList adapter = new EventList(HostActivity.this, eventList);
                listViewEvents.setAdapter(adapter);

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }


    private void addEvent(){   //method for user to create event
        String name = editTextName.getText().toString().trim();
        String sport = spinnerSports.getSelectedItem().toString();

        if(!TextUtils.isEmpty(name)){   //if name is not empty

            String uid = mAuth.getUid(); //call uid method to get user id

            String id = databaseEvent.push().getKey();  //call id method to get random string key

            Event event = new Event(id, name, sport); //call event method to

            databaseEvent.child(uid).child(id).setValue(event);  //method to store node in organise form (Event>UserID>Event.UKey>Details)

            Toast.makeText(this,"Event added",Toast.LENGTH_LONG).show();    //Show UI
        }
        else{   //if name is empty
            Toast.makeText(this,"You should enter a name", Toast.LENGTH_LONG).show();   //Show error UI
        }

    }
}

Event.java:

public class Event {

    String eventId;
    String eventName;
    String eventSport;

    public Event(String eventId, String eventName, String eventSport){
        this.eventId = eventId;
        this.eventName = eventName;
        this.eventSport = eventSport;

    }

    public String getEventId() {
        return eventId;
    }

    public String getEventName() {
        return eventName;
    }

    public String getEventSport() {
        return eventSport;
    }

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    要检索事件名称和事件端口,请尝试以下操作:

    FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("event").child(user.getUid());;
    
    reference.addListenerForSingleValueEvent(new ValueEventListener() {
     @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
    for(DataSnapshot datas: dataSnapshot.getChildren()){
       String eventname=datas.child("eventName").getValue().toString();
       String eventsport=datas.child("eventSport").getValue().toString();
        }
     }
     @Override
    public void onCancelled(DatabaseError databaseError) {
      }
     });
    

    你有这个数据库:

    event
    userID(retrieved from firebase authentication)
     Unique EventID(randomly generated by me)
        eventID: "Unique EventID
        eventName: "Test1
        eventSport: "TestSport12
    

    每个用户 ID 对于该用户都是唯一的,由于您希望用户检索他的数据,因此您可以使用 user.getUid() 检索用户 ID,然后在其中迭代以获取事件名称和事件端口。

    【讨论】:

    • 有没有办法让我获取所有不同用户的数据(以便每个人都可以查看其他用户的数据)
    • 是的,使用您的数据库,您可以将快照放在 child("event") 中,然后迭代两次,这将为您提供数据
    • 我已经对答案投了赞成票 :) 但因为我还是比较新的,所以我的赞成票暂时不会反映,直到我在 stackoverflow 中更加活跃
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 2020-12-24
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多