简体   繁体   English

如何向现有 Firebase 数据库条目添加新子项?

[英]How to Add a New Child to Existing Firebase Database Entry?

I have an existing Firebase database with user child elements, these represent dog owners in my application.. I am wondering if it is possible to later add a new dog under each owner?我有一个包含用户子元素的现有 Firebase 数据库,它们代表我的应用程序中的狗主人。我想知道以后是否可以在每个主人下添加一条新狗? Each dog would have its own details (breed, weight, gender etc).每只狗都有自己的详细信息(品种、体重、性别等)。

I feel like I somewhat know what to do but just wanted to put my thoughts here in hopes of not going around in circles for the next week..我觉得我有点知道该怎么做,但只是想把我的想法放在这里,希望下周不要绕圈子。

I assume I would potentially find the currentUser, create a new child(?), and set the new child value to Dogs?我假设我可能会找到 currentUser,创建一个新的孩子(?),并将新的孩子值设置为 Dogs? I am a little confused about the mAuth.createUserWithEmailAndPassword function.. I assume I wouldn't need this of course, is there an update option?我对 mAuth.createUserWithEmailAndPassword 函数有点困惑。我想我当然不需要这个,有更新选项吗?

Lastly, do I need to create a new constructor for Dogs?最后,我需要为 Dogs 创建一个新的构造函数吗? or would I house the details under the existing User constructor?或者我会把细节放在现有的 User 构造函数下? Very lastly, I have mostly spinners for this section, will this cause more issues?最后,我在这部分主要使用微调器,这会导致更多问题吗?

I am still learning about all of this and greatly appreciate the help and advice.我仍在学习这一切,非常感谢您的帮助和建议。 If I have missed anything that would help you, please let me know!如果我遗漏了对您有帮助的任何内容,请告诉我!

UPDATED - I have added below what I have now got thanks to help in the comments, still not showing any dog child in Firebase, and no errors in console:更新 - 我在下面添加了我现在得到的感谢评论中的帮助,仍然没有在 Firebase 中显示任何狗孩子,并且控制台中没有错误:

AboutDog class (after AddNewDog): AboutDog 类(在 AddNewDog 之后):

public class AboutDog extends AppCompatActivity {
    String[] breeds = new String[]{"Breed", "Chihuahua", "Jack Russell", "Beagle", "Border Collie", "Great Dane"};
    String[] ages = new String[]{"Age", "0-1yrs", "2-5yrs", "5-10yrs", "10-12yrs", "12-14yrs", "14+yrs"};
    String[] weights = new String[]{"Weight (kg)", "< 5kg", "5-10kg", "10-25kg", "25-45kg", "45kg+"};
    String[] gender = new String[]{"Gender", "Male", "Female"};
    String[] neutered = new String[]{"Neutered", "Yes", "No"};

    private EditText etName;
    Button nextPage;
    private ProgressBar progressBar;
    private Dog dog;
    DatabaseReference reference;
    String uid;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.about_dog);

        FirebaseAuth mAuth = FirebaseAuth.getInstance();
        FirebaseUser currentUser = mAuth.getCurrentUser();
        uid = currentUser.getUid();
        reference = FirebaseDatabase.getInstance().getReference("user");

        etName = (EditText) findViewById(R.id.name);
        Spinner breedDropdown = findViewById(R.id.breed);
        Spinner ageDropdown = findViewById(R.id.age);
        Spinner weightDropdown = findViewById(R.id.weight);
        Spinner genderDropdown = findViewById(R.id.gender);
        Spinner neuteredDropdown = findViewById(R.id.neutered);
        
        progressBar = (ProgressBar) findViewById(R.id.progressBar);

        ArrayAdapter<String> breedAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, breeds);
        breedAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        breedDropdown.setAdapter(breedAdapter);

        ArrayAdapter<String> ageAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, ages);
        ageAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        ageDropdown.setAdapter(ageAdapter);

        ArrayAdapter<String> weightAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, weights);
        weightAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        weightDropdown.setAdapter(weightAdapter);

        ArrayAdapter<String> genderAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, gender);
        genderAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        genderDropdown.setAdapter(genderAdapter);

        ArrayAdapter<String> neuteredAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, neutered);
        neuteredAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        neuteredDropdown.setAdapter(neuteredAdapter);

        nextPage = (Button)findViewById(R.id.nextButton);

        nextPage.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                String name = etName.getText().toString().trim();
                String breed = breedDropdown.getSelectedItem().toString().trim();
                String age = ageDropdown.getSelectedItem().toString().trim();
                String weight = weightDropdown.getSelectedItem().toString().trim();
                String gender = genderDropdown.getSelectedItem().toString().trim();
                String neutered = neuteredDropdown.getSelectedItem().toString().trim();

                if(name.isEmpty()) {
                    etName.setError("Dog's name is required");
                    etName.requestFocus();
                    return;
                }

                if(breedDropdown.getSelectedItemPosition() == 0) {
                    Toast.makeText(AboutDog.this, "Breed is required", Toast.LENGTH_LONG).show();
                    breedDropdown.requestFocus();
                    breedDropdown.requestFocusFromTouch();
                    breedDropdown.performClick();
                    return;
                }

                if(ageDropdown.getSelectedItemPosition() == 0) {
                    Toast.makeText(AboutDog.this, "Age is required", Toast.LENGTH_LONG).show();
                    ageDropdown.requestFocus();
                    ageDropdown.requestFocusFromTouch();
                    ageDropdown.performClick();
                    return;
                }

                if(weightDropdown.getSelectedItemPosition() == 0) {
                    Toast.makeText(AboutDog.this, "Weight is required", Toast.LENGTH_LONG).show();
                    weightDropdown.requestFocus();
                    weightDropdown.requestFocusFromTouch();
                    weightDropdown.performClick();
                    return;
                }

                if(genderDropdown.getSelectedItemPosition() == 0) {
                    Toast.makeText(AboutDog.this, "Gender is required", Toast.LENGTH_LONG).show();
                    genderDropdown.requestFocus();
                    genderDropdown.requestFocusFromTouch();
                    genderDropdown.performClick();
                    return;
                }

                if(neuteredDropdown.getSelectedItemPosition() == 0) {
                    Toast.makeText(AboutDog.this, "Neutered status is required", Toast.LENGTH_LONG).show();
                    neuteredDropdown.requestFocus();
                    neuteredDropdown.requestFocusFromTouch();
                    neuteredDropdown.performClick();
                    return;
                }

                dog = new Dog(name, breed, age, weight, gender, neutered);
                registerDog(name, breed, age, weight, gender, neutered);

            }
        });
    }

    public void registerDog(String name, String breed, String weight, String age, String gender, String neutered) {

        progressBar.setVisibility(View.VISIBLE);

        reference.child(uid).child("dogs").setValue(dog)
                .addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        if (task.isSuccessful()){
                            //successfully added dog information to owner
                            Toast.makeText(AboutDog.this, "Successfully added dog information to Owner ", Toast.LENGTH_LONG).show();
                        } else {
                            Log.w("TAG", "Failure - Dog not Created", task.getException());
                            Toast.makeText(AboutDog.this, "Dog not added, please try again..", Toast.LENGTH_LONG).show();
                        }
                    }
                });
    }

}

Dog constructor:狗构造函数:

public class Dog {
    private String name, breed, age, weight, gender, neutered;

    public Dog() {

    }

    public Dog (String name, String breed, String age, String weight, String gender, String neutered) {
        this.name = name;
        this.breed = breed;
        this.age = age;
        this.weight = weight;
        this.gender = gender;
        this.neutered = neutered;
    }
    

    public String getName() {
        return name;
    }

    public String getBreed() {
        return breed;
    }

    public String getAge() {
        return age;
    }

    public String getWeight() { return weight; }

    public String getGender() { return gender; }

    public String getNeutered() { return neutered; }
}
  1. For setting values of dogs to particular owner in firebase database you can you setValue() method available in firebase.要将狗的值设置为 firebase 数据库中的特定所有者,您可以在 firebase 中使用 setValue() 方法。

eg In AddNewDog class you can implement adding new dog by:例如,在 AddNewDog 类中,您可以通过以下方式实现添加新狗:

//get current user id if already logged in:
FirebaseAuth mAuth = FirebaseAuth.getInstance();
FirebaseUser currentUser = mAuth.getCurrentUser();
if (currentUser == null) {
//redirect to login
....
}
String uid = currentUser.getUid();
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("user");

//adding dogs data in current logged in owner:
Dog dog = new Dog(...);
reference.child(uid).child("dogs").setValue(dog)
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()){
                        //successfully added dog information to owner
                        ....
                    }
                }
            });
  1. Also as in above code, I recommend using new Dog constructor than adding dog information as well in User class since User class already has user details that we don't need while populating dog information.同样在上面的代码中,我建议使用 new Dog 构造函数而不是在 User 类中添加狗信息,因为 User 类已经有我们在填充狗信息时不需要的用户详细信息。

  2. And lastly I don't think Spinner will give any problem.最后,我认为 Spinner 不会有任何问题。 Just get value of selected Spinners and create Dog object with those value.只需获取选定 Spinner 的值并使用这些值创建 Dog 对象。 Good luck.祝你好运。

When it comes to authentication you should use User class also to manage owner of dogs.在进行身份验证时,您还应该使用 User 类来管理狗的主人。 I saw your edited question .我看到了你编辑过的问题。 Also your Dog constructor looks great , use it to store dogs data easier .此外,您的 Dog 构造函数看起来很棒,使用它可以更轻松地存储狗数据。 So what to do !那么该怎么办 ! I think when dog owner will be registered to your app by providing dog info firstly you will add the authentication details with uid and his first dog's info as child of Owner .我认为当狗主人首先通过提供狗信息注册到您的应用程序时,您将使用 uid 和他的第一只狗的信息添加身份验证详细信息作为 Owner 的孩子。 Same time you should store a boolean to add only next dog's data without owner authentication info.同时,您应该存储一个布尔值以仅添加下一条狗的数据,而无需所有者身份验证信息。

Keep in mind for register owner use email as name field .请记住,注册所有者使用电子邮件作为名称字段。 Name can be same but email not.姓名可以相同,但电子邮件不能。 To Register use getUid() method , check the code 0f 1st time registration-要注册使用 getUid() 方法,请检查代码 0f 1st time registration-

User user = new User(ownername,email, password);
            try {
                prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
                boolean firsttimeLoad = prefs.getBoolean("first_time", true);
                if (firsttimeLoad) {
                    FirebaseDatabase.getInstance().getReference(ownername)
                            .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                            .setValue(user).addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            if (task.isSuccessful()) {
                                //
                                Toast.makeText(AboutDog.this, "Successfully Registered", Toast.LENGTH_SHORT).show();

                         
                            } else {
                                //display a failure message
                            }
                        }
                    });

                    SharedPreferences.Editor editor = prefs.edit();
                    editor.putBoolean("first_time", false);
                    editor.commit();

Next time just add dogs name as child of owner , in this case avoid using getUid() , from same device owner can add dogs.下次只需添加狗名称作为所有者的孩子,在这种情况下避免使用 getUid() ,来自同一设备所有者可以添加狗。 check the code-检查代码-

 dog = new Dog(name, breed, age, weight, gender, neutered);
                    FirebaseDatabase.getInstance().getReference(ownername)
                            .child(name) // this is dog name
                            .setValue(dog).addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            if (task.isSuccessful()) {

                                Toast.makeText(AboutDog.this, "Successfully added dog information to Owner ", Toast.LENGTH_LONG).show();

                            } else {
                                Log.w("TAG", "Failure - Dog not Created", task.getException());
                                Toast.makeText(AboutDog.this, "Dog not added, please try again..", Toast.LENGTH_LONG).show();
                            }
                        }
                    });

Here your AboutDog activity -在这里您的AboutDog活动 -

public class AboutDog extends AppCompatActivity {
    String[] breeds = new String[]{"Breed", "Chihuahua", "Jack Russell", "Beagle", "Border Collie", "Great Dane"};
    String[] ages = new String[]{"Age", "0-1yrs", "2-5yrs", "5-10yrs", "10-12yrs", "12-14yrs", "14+yrs"};
    String[] weights = new String[]{"Weight (kg)", "< 5kg", "5-10kg", "10-25kg", "25-45kg", "45kg+"};
    String[] gender = new String[]{"Gender", "Male", "Female"};
    String[] neutered = new String[]{"Neutered", "Yes", "No"};

    private EditText etName;
    Button nextPage;
    private ProgressBar progressBar;
    private Dog dog;
    DatabaseReference reference;
    String uid;

    private SharedPreferences prefs;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.about_dog);

      /*  FirebaseAuth mAuth = FirebaseAuth.getInstance();
        FirebaseUser currentUser = mAuth.getCurrentUser();
        uid = currentUser.getUid();
        reference = FirebaseDatabase.getInstance().getReference("user");*/

        etName = (EditText) findViewById(R.id.name);
        Spinner breedDropdown = findViewById(R.id.breed);
        Spinner ageDropdown = findViewById(R.id.age);
        Spinner weightDropdown = findViewById(R.id.weight);
        Spinner genderDropdown = findViewById(R.id.gender);
        Spinner neuteredDropdown = findViewById(R.id.neutered);

        progressBar = (ProgressBar) findViewById(R.id.progressBar);

        ArrayAdapter<String> breedAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, breeds);
        breedAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        breedDropdown.setAdapter(breedAdapter);

        ArrayAdapter<String> ageAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, ages);
        ageAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        ageDropdown.setAdapter(ageAdapter);

        ArrayAdapter<String> weightAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, weights);
        weightAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        weightDropdown.setAdapter(weightAdapter);

        ArrayAdapter<String> genderAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, gender);
        genderAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        genderDropdown.setAdapter(genderAdapter);

        ArrayAdapter<String> neuteredAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, neutered);
        neuteredAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        neuteredDropdown.setAdapter(neuteredAdapter);

        nextPage = (Button) findViewById(R.id.nextButton);

        nextPage.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                String ownername = (TextViewEditText) findViewById(R.id.logInname); // this line from your question
                //before edit

                String name = etName.getText().toString().trim();
                String breed = breedDropdown.getSelectedItem().toString().trim();
                String age = ageDropdown.getSelectedItem().toString().trim();
                String weight = weightDropdown.getSelectedItem().toString().trim();
                String gender = genderDropdown.getSelectedItem().toString().trim();
                String neutered = neuteredDropdown.getSelectedItem().toString().trim();

                if (name.isEmpty()) {
                    etName.setError("Dog's name is required");
                    etName.requestFocus();
                    return;
                }

                if (breedDropdown.getSelectedItemPosition() == 0) {
                    Toast.makeText(AboutDog.this, "Breed is required", Toast.LENGTH_LONG).show();
                    breedDropdown.requestFocus();
                    breedDropdown.requestFocusFromTouch();
                    breedDropdown.performClick();
                    return;
                }

                if (ageDropdown.getSelectedItemPosition() == 0) {
                    Toast.makeText(AboutDog.this, "Age is required", Toast.LENGTH_LONG).show();
                    ageDropdown.requestFocus();
                    ageDropdown.requestFocusFromTouch();
                    ageDropdown.performClick();
                    return;
                }

                if (weightDropdown.getSelectedItemPosition() == 0) {
                    Toast.makeText(AboutDog.this, "Weight is required", Toast.LENGTH_LONG).show();
                    weightDropdown.requestFocus();
                    weightDropdown.requestFocusFromTouch();
                    weightDropdown.performClick();
                    return;
                }

                if (genderDropdown.getSelectedItemPosition() == 0) {
                    Toast.makeText(AboutDog.this, "Gender is required", Toast.LENGTH_LONG).show();
                    genderDropdown.requestFocus();
                    genderDropdown.requestFocusFromTouch();
                    genderDropdown.performClick();
                    return;
                }

                if (neuteredDropdown.getSelectedItemPosition() == 0) {
                    Toast.makeText(AboutDog.this, "Neutered status is required", Toast.LENGTH_LONG).show();
                    neuteredDropdown.requestFocus();
                    neuteredDropdown.requestFocusFromTouch();
                    neuteredDropdown.performClick();
                    return;
                }

                //TODO

              /*   dog = new Dog(name, breed, age, weight, gender, neutered);
                 registerDog(name, breed, age, weight, gender, neutered);*/

                User user = new User(ownername, email, password);
                try {
                    prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
                    boolean firsttimeLoad = prefs.getBoolean("first_time", true);
                    if (firsttimeLoad) {
                        FirebaseDatabase.getInstance().getReference(ownername)
                                .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                                .setValue(user).addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
                                if (task.isSuccessful()) {
                                    //
                                    Toast.makeText(AboutDog.this, "Successfully Registered", Toast.LENGTH_SHORT).show();

                                    //  startActivity(new Intent(LoginActivity.this, MainActivity.class));
                                    //   finish();
                                } else {
                                    //display a failure message
                                }
                            }
                        });

                        SharedPreferences.Editor editor = prefs.edit();
                        editor.putBoolean("first_time", false);
                        editor.commit();
                    } else {

                        dog = new Dog(name, breed, age, weight, gender, neutered);
                        FirebaseDatabase.getInstance().getReference(ownername)
                                .child(name) // this is dog name
                                .setValue(dog).addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
                                if (task.isSuccessful()) {

                                    Toast.makeText(AboutDog.this, "Successfully added dog information to Owner ", Toast.LENGTH_LONG).show();

                                } else {
                                    Log.w("TAG", "Failure - Dog not Created", task.getException());
                                    Toast.makeText(AboutDog.this, "Dog not added, please try again..", Toast.LENGTH_LONG).show();
                                }
                            }
                        });

                    }
                } catch (
                        Exception e) {
                    e.printStackTrace();
                }

            }
        });
    }

 /*   public void registerDog(String name, String breed, String weight, String age, String gender, String neutered) {

        progressBar.setVisibility(View.VISIBLE);

        reference.child(uid).child("dogs").setValue(dog)
                .addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        if (task.isSuccessful()){
                            //successfully added dog information to owner
                            Toast.makeText(AboutDog.this, "Successfully added dog information to Owner ", Toast.LENGTH_LONG).show();
                        } else {
                            Log.w("TAG", "Failure - Dog not Created", task.getException());
                            Toast.makeText(AboutDog.this, "Dog not added, please try again..", Toast.LENGTH_LONG).show();
                        }
                    }
                });
    }*/

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM