这是我在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());
}
});
这里有什么问题?任何人都可以帮我吗?
答案 0 :(得分:27)
您始终使用相同参考
Person person = new Person();
//Adding values
person.setName(name);
person.setAddress(address);
ref.child("Person").setValue(person);
以这种方式使用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()。