繁体   English   中英

您如何使用 Data Snapshot 跨多个子节点检索数据?

[英]How do you use Data Snapshot to retrieve data across multiple child nodes?

我想检索在每个 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 节点中。 有没有办法让我仍然从每个用户生成的节点检索数据,同时仍然让用户通过他们自己的用户 ID 存储他们的数据? 我使用他们的用户 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
        }

    }
}

事件.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;
    }

要检索 eventname 和 eventsport,请尝试以下操作:

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

每个 userid 对于该用户都是唯一的,并且由于您希望用户检索他的数据,因此您可以使用user.getUid()来检索 userid,然后在其中迭代以获取 eventname 和 eventsport。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM