Firebase使用Hashmap在同一个孩子上推送数据

Dav*_*idA 5 android hashmap firebase firebase-realtime-database

对于我的Android应用程序,我正在尝试将多个字符串添加到同一个孩子(Firebase唯一ID),用户将在其中输入不同的布局.我正在使用Hashmap将字符串放入Firebase.我有4-5种不同的布局,用户会遇到并需要填写信息,但是当我将其保存在数据库中时,它总是使用不同的唯一ID,我需要将它们全部放在同一个ID下.

在图像中,我需要所有信息都在第一个唯一ID下.

这是我的代码,我创建了一个Parent类,每个布局(其他类)都有一些方法来访问Hashmap.

家长班:

public class FireBaseDataMap {

    private HashMap<String, String> dataMap = new HashMap<String, String>();

    public HashMap<String, String> fireebaseMap(){
        return dataMap;
    }

}
Run Code Online (Sandbox Code Playgroud)

第一个活动:我在onClick(视图)方法中放置了需要帮助的箭头.

    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));

        }
    }

}
Run Code Online (Sandbox Code Playgroud)

第二个活动:我只是发布了我需要帮助的方法来进行这个活动所以它看起来不会那么长,但是如果需要全班来理解那么我可以更新它.

 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) {


        }

    }
}
Run Code Online (Sandbox Code Playgroud)

我试过看了一遍,尝试了不同的方法使它工作,但没有.任何帮助,将不胜感激.如果需要澄清,那么将尽我所能.

我想到的另一种方式是,如果我可以在每个活动上访问相同的saveButton,那么它是否有效.

Uma*_*adi 6

据我了解,您需要一个节点下的所有属性。像这样的东西

null
  |-------uniqueKey
           |------birthdate
           |------birthplace
           |------firstname
           |------lastname
           |------missingdate
           |------personAge
           |------personHeight
           |------personWeight
Run Code Online (Sandbox Code Playgroud)

但是,您正在调用推送。mDatabase.child("null").push().setValue(dataMap); 'push' 所做的就是在数据库上推送一个新节点,并且当您调用 setValue 时,您将 dataMap 添加到该新的“push key”。处理数据列表时应该使用推送。当您第一次调用 push 时,它会向您创建的“空”子节点添加一个新节点。

你得到这个

null
 |
-----FirstuniquePushKey
Run Code Online (Sandbox Code Playgroud)

在你的第二个活动中,当你再次调用 push 时,你会得到这个

null
 |-------FirstUniqueyKey
 |         |--------
 |-------SecondUniqueKey
           |--------
Run Code Online (Sandbox Code Playgroud)

如果要将属性添加到同一个子项(唯一键)。像这样向下遍历到那个节点

   mDatabase.child("null").child("FirstUniqueKey").child("pesronAge").setValue('n/a')
Run Code Online (Sandbox Code Playgroud)

这样您就不会调用“推送”,因此不会创建新的“推送”键。您位于 firstuniqueKey 节点,创建另一个名为 personAge 的子节点并设置其值。我希望这是有道理的。

编辑

您必须调用设置值。如果你这样做,

mDatabase.child("null").child("FirstUniqueKey").setValue(HashMap). 
Run Code Online (Sandbox Code Playgroud)

这就是为什么它会覆盖您之前拥有的内容。您可以通过两种方式实现您想要的

1) 对于第二个哈希图中的每个键。设置值。

    mDatabase.child("null").child("FirstUniqueKey").child("PersonAge").setValue('')

mDatabase.child("null").child("FirstUniqueKey").child("PersonHeight").setValue('')

 mDatabase.child("null").child("FirstUniqueKey").child("PersonWeight").setValue('')  
Run Code Online (Sandbox Code Playgroud)

2)实现它的第二种方法是创建一个新的pushKey。

mDatabase.child("null").child("FirstUniqueKey").push().setValue(HashMap)
Run Code Online (Sandbox Code Playgroud)

请注意我如何在子“FirstUniqueKey”处按下并设置值。