如何在 firebase 数据库中添加新数据后获取所有数据

How to fetch all data after adding new data in firebase database

这是我在 firebase 中添加人员对象的代码。

    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("Person");


    buttonSave.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

            String name = editTextName.getText().toString().trim();
            String address = editTextAddress.getText().toString().trim();

            //Creating Person object
            Person person = new Person();
            person.setName(name);
            person.setAddress(address);
            new Firebase(Config.FIREBASE_URL).child("Person").push().setValue(person);
        }
    });

    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                //Getting the data from snapshot
                Person person = postSnapshot.getValue(Person.class);

                //Adding it to a string
                String string = "Name: " + person.getName() + "\nAddress: " + person.getAddress() + "\n\n";

                //Displaying it on textview
                textViewPersons.setText(string);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            System.out.println("The read failed: " + databaseError.getMessage());
        }
    });

添加数据工作正常,每次添加都会为人员创建一个新密钥。

但是 addValueEventListener 只显示最后添加的条目。我想要所有的条目数据。

谁能帮我解决这个问题?

每当 Person 节点发生任何变化时,您都会通过 onDataChange() 收到通知。在那里你循环遍历每个人然后每次调用:

textViewPersons.setText(string);

所以您不断地用每个人的信息替换文本视图的内容。在每个循环之后,它最终将只显示最后一个用户的信息。你可以很容易地看到代码通过添加循环遍历所有人:

System.out.println(string);

有了这个,您将在 logcat 中看到每个人,但在文本视图中只能看到最后一个人。

一种解决方案是使用 ListViewRecyclerView,两者都处理项目列表。另一种(更快实现)向所有用户展示在文本视图中附加字符串的方法:

textViewPersons.setText(textViewPersons.getText()+string+"\n");

如果有帮助,试试这个:

String dataviewer=new String();

Firebase firebase=new Firebase(Config.FIREBASE_URL);

buttonSave.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {

        String name = editTextName.getText().toString().trim();
        String address = editTextAddress.getText().toString().trim();

        //Creating Person object
        Person person = new Person();
        person.setName(name);
        person.setAddress(address);
        new Firebase(Config.FIREBASE_URL).child("Person").push().setValue(person);
    }
});

  firebase.child("Person").addChildEventListener(new ChildEventListener() {
        // Retrieve values as they are added to Firebase
        @Override
        public void onChildAdded(DataSnapshot snapshot, String previousChildKey) {

            Map<String,Object> vals=(Map<String,Object>)snapshot.getValue();
            String name_person=String.valueOf(vals.get("name"));
            String address_person=String.valueOf(vals.get("address"));
            dataviewer+="Name: " + name_person + "\nAddress: " + address_person + "\n\n";
            }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {


        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });