对于我的 android 应用程序,我试图将多个字符串添加到同一个子项(Firebase 唯一 ID),用户将在其中输入不同的布局。我正在使用 Hashmap 将字符串放入 Firebase。我有 4-5 种不同的布局,用户会遇到这些布局并需要填写信息,但是当我将它保存在数据库中时,它总是在不同的唯一 ID 下,我需要它们都在同一个 ID 下。
这是我的代码,我创建了一个父类,每个布局(其他类)都有一些方法来访问 Hashmap。
父类:
public class FireBaseDataMap {
private HashMap<String, String> dataMap = new HashMap<String, String>();
public HashMap<String, String> fireebaseMap(){
return dataMap;
}
}
第一个 Activity :我在 onClick(View view) 方法中需要帮助的地方放了一个箭头。
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
//UI References
private EditText firstName;
private EditText lastName;
private EditText birthPlace;
private EditText etxtBirthdate;
private EditText etxtMissingDate;
private Button saveButton;
private Button cancel_button;
private DatePickerDialog birthdateDatePickerDialog;
private DatePickerDialog missingDatePickerDialog;
private DatabaseReference mDatabase;
private SimpleDateFormat dateFormatter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dateFormatter = new SimpleDateFormat("dd-MM-yyyy", Locale.US);
findViewsById();
setDateTimeField();
saveButton = (Button) findViewById(R.id.saveButton);
cancel_button = (Button) findViewById(R.id.cancel_button);
saveButton.setOnClickListener(this);
cancel_button.setOnClickListener(this);
}
private void findViewsById() {
firstName = (EditText) findViewById(R.id.firstName);
lastName = (EditText) findViewById(R.id.lastName);
birthPlace = (EditText) findViewById(R.id.birthPlace);
etxtBirthdate = (EditText) findViewById(R.id.etxt_birthdate);
etxtBirthdate.setInputType(InputType.TYPE_NULL);
etxtBirthdate.requestFocus();
etxtMissingDate = (EditText) findViewById(R.id.etxt_missingdate);
etxtMissingDate.setInputType(InputType.TYPE_NULL);
etxtMissingDate.requestFocus();
}
@Override
public void onClick(View view) {
if(view == etxtBirthdate) {
birthdateDatePickerDialog.show();
}
if(view == etxtMissingDate){
missingDatePickerDialog.show();
}
if(view == saveButton){
String FirstName = firstName.getText().toString().trim();
String LastName = lastName.getText().toString().trim();
String BirthPlace = birthPlace.getText().toString().trim();
String BirthDate = etxtBirthdate.getText().toString().trim();
String MissingDate = etxtMissingDate.getText().toString().trim();
mDatabase = FirebaseDatabase.getInstance().getReference();
// Here is where im accessing the parent class and need help <------
FireBaseDataMap obj = new FireBaseDataMap();
HashMap<String, String> dataMap = obj.fireebaseMap();
if(FirstName.isEmpty()) {
FirstName = "n/a";
dataMap.put("firstName", FirstName);
}
else
dataMap.put("firstName", FirstName);
if(LastName.isEmpty()) {
LastName = "n/a";
dataMap.put("lastName", LastName);
}
else
dataMap.put("lastName", LastName);
if(BirthPlace.isEmpty()) {
BirthPlace = "n/a";
dataMap.put("birthPlace", BirthPlace);
}
else
dataMap.put("birthPlace", BirthPlace);
if(BirthDate.isEmpty()) {
BirthDate = "n/a";
dataMap.put("birthDate", BirthDate);
}
else
dataMap.put("birthDate", BirthDate);
if(MissingDate.isEmpty()) {
MissingDate = "n/a";
dataMap.put("missingDate", MissingDate);
}
else
dataMap.put("missingDate", MissingDate);
mDatabase.child("null").push().setValue(dataMap);
}
if(view == cancel_button){
startActivity(new Intent(this, PhysicalAttributes.class));
}
}
}
第二个 Activity :我只是在我需要帮助的地方发布这个 Activity 的方法,所以它看起来不会太长,但如果需要完整的类(class)来理解,那么我可以更新它。
public void onClick(View view) {
if (view == saveButton) {
String PersonAge = personAge.getText().toString().trim();
String PersonHeight = personHeight.getText().toString().trim();
String PersonWeight = personWeight.getText().toString().trim();
mDatabase = FirebaseDatabase.getInstance().getReference();
FireBaseDataMap obj = new FireBaseDataMap();
HashMap<String, String> dataMap = obj.fireebaseMap();
if(PersonAge.isEmpty()){
PersonAge = "n/a";
dataMap.put("personAge", PersonAge);
}
else
dataMap.put("personAge", PersonAge);
if(PersonHeight.isEmpty()) {
PersonHeight = "n/a";
dataMap.put("personHeight", PersonHeight);
}
else
dataMap.put("personHeight", PersonHeight);
if(PersonWeight.isEmpty()) {
PersonWeight = "n/a";
dataMap.put("personWeight", PersonWeight);
}
else
dataMap.put("personWeight", PersonWeight);
mDatabase.child("null").push().setValue(dataMap);
}
if (view == cancel_button) {
}
}
}
我试过四处寻找并尝试了不同的方法来让它工作,但一无所获。任何帮助,将不胜感激。如果需要澄清,那么我会尽力而为。
我考虑的另一种方法是,如果可行的话,我是否可以在每个 Activity 上访问相同的保存按钮。
最佳答案
据我了解,您希望所有属性都在一个节点下。像这样的东西
null
|-------uniqueKey
|------birthdate
|------birthplace
|------firstname
|------lastname
|------missingdate
|------personAge
|------personHeight
|------personWeight
但是,您调用的是推送。 mDatabase.child("null").push().setValue(dataMap); “push”的作用是从字面上将一个新节点推送到数据库中,当您调用 setValue 时,您将 dataMap 添加到新的“push key”中。在处理数据列表时,您应该使用推送。当您第一次调用 push 时,它会向您创建的“空”子节点添加一个新节点。
你明白了
null
|
-----FirstuniquePushKey
在你的第二个 Activity 中,当你再次调用推送时,你会得到这个
null
|-------FirstUniqueyKey
| |--------
|-------SecondUniqueKey
|--------
如果你想给同一个 child 添加属性(唯一键)。像这样向下遍历到那个节点
mDatabase.child("null").child("FirstUniqueKey").child("pesronAge").setValue('n/a')
这样您就不会调用“push”,因此不会创建新的“push”键。您位于第一个 uniqueKey 节点,您创建了另一个名为 personAge 的子节点并设置了它的值。我希望这是有道理的。
编辑
您必须调用设置值。如果你这样做,
mDatabase.child("null").child("FirstUniqueKey").setValue(HashMap).
这就是为什么它会覆盖您之前拥有的内容。您可以通过两种方式实现您想要的
1) 对于第二个 HashMap 中的每个键。设置值。
mDatabase.child("null").child("FirstUniqueKey").child("PersonAge").setValue('')
mDatabase.child("null").child("FirstUniqueKey").child("PersonHeight").setValue('')
mDatabase.child("null").child("FirstUniqueKey").child("PersonWeight").setValue('')
2)第二种实现方式创建一个新的pushKey。
mDatabase.child("null").child("FirstUniqueKey").push().setValue(HashMap)
请注意我是如何在子“FirstUniqueKey”处按下并设置值的。
关于android - Firebase 使用 Hashmap 在同一个 child 上推送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42420997/