android - Firebase 使用 Hashmap 在同一个 child 上推送数据

标签 android firebase hashmap firebase-realtime-database

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

In the image I need all the information to be under just the first unique 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/

相关文章:

java - 根据键返回列表过滤HashMap

ruby - 如何将两个嵌套数据结构合并为一个?

Android 惰性数据绑定(bind)可能吗?

ios - 如何从 iOS 中的 firebase 中的子节点获取数据

android - 无法在android studio中同步firebase

javascript - 使用 Firebase Cloud Functions 将值从一个节点复制到多个其他节点

java - 从 HashMap 中删除特定条目的简短方法

android - 设置 Android 按钮的状态

android - 用动画填充自定义 View (Android)

android - 如何在调用方法中检查 Kotlin 协程 job.isActive