如何在firebase android中添加新数据

时间:2016-06-01 06:56:48

标签: android firebase firebase-realtime-database

这是我在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());
        }
    });

这里有什么问题?任何人都可以帮我吗?

4 个答案:

答案 0 :(得分:27)

您始终使用相同参考

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

Check the doc

  

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

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

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

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

答案 1 :(得分:1)

您可以为数据添加新的子项,例如:

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会有所不同,因此,您将始终转到用户下userId中新登录用户的新数据列表。

答案 2 :(得分:1)

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

 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"

答案 3 :(得分:0)

每次点击"Person"时,您都会引用setValue()子项并设置其值(buttonSave),{{1}}只会编辑一个孩子。请尝试使用push()