简体   繁体   中英

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? 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? I am a little confused about the mAuth.createUserWithEmailAndPassword function.. I assume I wouldn't need this of course, is there an update option?

Lastly, do I need to create a new constructor for Dogs? or would I house the details under the existing User constructor? 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:

AboutDog class (after 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.

eg In AddNewDog class you can implement adding new dog by:

//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.

  2. And lastly I don't think Spinner will give any problem. Just get value of selected Spinners and create Dog object with those value. Good luck.

When it comes to authentication you should use User class also to manage owner of dogs. I saw your edited question . Also your Dog constructor looks great , use it to store dogs data easier . 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 . 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-

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. 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 -

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();
                        }
                    }
                });
    }*/

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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