【问题标题】:How to add new data in firebase android如何在firebase android中添加新数据
【发布时间】:2016-09-30 09:34:03
【问题描述】:

这是我在 firebase 实时数据库中添加新人的逻辑。但是,它只是用新数据更新旧数据,而不是创建新条目。

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


            /*
            new Firebase(Config.FIREBASE_URL)
                    .push()
                    .child("title")
                    .setValue(text.getText().toString());
            */

            Firebase ref = new Firebase(Config.FIREBASE_URL);
            String name = editTextName.getText().toString().trim();
            String address = editTextAddress.getText().toString().trim();

            //Creating Person object
            Person person = new Person();

            //Adding values
            person.setName(name);
            person.setAddress(address);
            ref.child("Person").setValue(person);

        }
    });


    new Firebase(Config.FIREBASE_URL).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            for (DataSnapshot postSnapshot : snapshot.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(FirebaseError firebaseError) {
            System.out.println("The read failed: " + firebaseError.getMessage());
        }
    });

这里有什么问题?谁能帮我解决这个问题?

【问题讨论】:

标签: android firebase firebase-realtime-database


【解决方案1】:

您始终使用相同的参考

 Person person = new Person();
 //Adding values
 person.setName(name);
 person.setAddress(address);
 ref.child("Person").setValue(person);

Check the doc:

以这种方式使用 setValue() 会覆盖指定位置的数据,包括任何子节点。

在您的情况下,出于这个原因,您正在覆盖相同的数据

您应该使用push() 方法在每次将新子项添加到指定的 Firebase 引用时生成唯一 ID。

 Person person = new Person();
 //Adding values
 person.setName(name);
 person.setAddress(address);
 DatabaseReference newRef = ref.child("Person").push();
 newRef.setValue(person);

【讨论】:

  • 感谢您的回复。添加部分现在按预期工作。你能帮我看看我应该在 onDataChange 中做些什么更改,以便显示数据库中添加的所有人员。
  • 您可以使用 ref.child("Person") 作为参考来使用 onChildAdded() 回调。
【解决方案2】:

您可以将新的 Child 添加到您的数据中,例如:

mAuth = FirebaseAuth.getInstance();
FirebaseUser user = mAuth.getCurrentUser();
String userId = user.getUid();
Firebase rootRef = new Firebase(Config.USER_URL);
Firebase userRef = rootRef.child("Users");
Person newUser = new Person();
newUser.setFirstName(firstName);
newUser.setLastName(lastName);
userRef.child(userId).setValue(newUser);

当登录用户不同时,userId会有所不同,因此,您将始终在Users下的userId中转到新登录用户的新数据列表。

【讨论】:

    【解决方案3】:

    每次选择将数据插入数据库时​​,都会调用以下方法。 您可以集成尽可能多的属性。它每次都会产生一个唯一的键并插入记录。

     public void insert2database(double latitude,double longitude,String name) {
    
        HashMap<String,String> student=new HashMap<>();
        
        student.put("Name",name);
        student.put("Lat", String.valueOf(latitude));  
        student.put("Long", String.valueOf(longitude));   
        student.put("Phone", String.valueOf("78787500000")); 
        
        DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
        DatabaseReference tasksRef = rootRef.child("USERS").push();
        tasksRef.setValue(student);
    }
    

    它将像这样在数据库层次结构中

    -database-4df17-default-rtdb
       -USERS
          -MUqgUu8zUpYcIaUVSsj
            -Lat:  "25.9405145"
            -Long: "79.9100086"
            -Name:"Dilroop"
            -Phone: "78787500000"
          -MUqoL2AUQFjH2ggKWev
            -Lat: "32.9405145"
            -Long: "73.9178186"
            -Name: "Sanghavi"
            -Phone: "78787500000"
          -MUsfc-H-7KdQhrkHb_F
            -Lat: "52.9405145"
            -Long: "79.9175856"
            -Name: "MDNSRF"
            -Phone: "78787500000"
    

    【讨论】:

      【解决方案4】:

      每次单击buttonSave 时,您都会引用"Person" 子元素并设置它的值(setValue()),这只会编辑该子元素。尝试改用push()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-22
        • 2020-09-06
        • 1970-01-01
        • 2020-04-25
        • 2019-01-30
        • 1970-01-01
        • 2023-03-14
        相关资源
        最近更新 更多