Обновление Firebase делает новый с тем же идентификатором, кроме последнего символа

Я использую этот код для обновления данных Firebase, но он делает новый. Я пробовал много кода, и он дозирует то же самое, что и новый, с тем же ключом, кроме последнего символа.

Я использовал это как сайт Firebase, но он не работает. Я создал новый, и в следующий раз его обновление:

    Map<String, Object> childUpdate = new HashMap<>();
childUpdate.put("/masjeds/" + masjed.getId(), masjed.toMap());
reference.updateChildren(childUpdate);

и этот код сделал то же самое

     final FirebaseDatabase database = FirebaseDatabase.getInstance();
    masjeds = database.getReference("masjeds");

        reference.child(masjed.getId()).setValue(masjed, new DatabaseReference.CompletionListener() {
        @Override
        public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
         //   Toast.makeText(MyMasjedsActivity.this, databaseError.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });

Масский класс - это простой Java-объект

public class Masjed {
private String userID;
private String id;
private String name;
private String address;
private String phone;
private boolean matloopEmam;

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getUserID() {
    return userID;
}

public void setUserID(String userID) {
    this.userID = userID;
}

public boolean isMatloopEmam() {
    return matloopEmam;
}

public void setMatloopEmam(boolean matloopEmam) {
    this.matloopEmam = matloopEmam;
}


public Masjed(String name, String address, String phone) {
    this.name = name;
    this.address = address;
    this.phone = phone;
}

public Masjed() {

}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

public String getPhone() {
    return phone;
}

public void setPhone(String phone) {
    this.phone = phone;
}

public Map<String, Object> toMap() {
    Map<String, Object> map = new HashMap<>();
    map.put("name", name);
    map.put("address", address);
    map.put("phone", phone);
    map.put("id", id);
    map.put("userID", userID);
    return map;
}

}

введите описание изображения здесь

id - проблема, которую я предполагал, что push.getkey и поместить ее как ID то использование push.setValue(masjed) будет использовать тот же ключ получилось, что не всегда происходит изменение ключа, когда я использую его dosnt, и поэтому он создает новый ответ, который помог мне ответить Честер

Ответ 1

Я надеюсь, что это поможет, использовал его в моем проекте для домашних животных (это не очищает решение, но оно работает):

masjeds = database.getReference("masjeds");

ValueEventListener listener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) { 
                masjedKey = dataSnapshot1.getKey(); // This is a member variable
                masjed = dataSnapshot1.getValue(Masjed.class); // This is a member variable
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
};
masjeds.orderByChild("id").equalTo(masjed.getId()).addValueEventListener(listener);

//Use your Map to update each value this is just an example
masjeds.child(masjedKey).child("name").setValue("John"); //you can add event listener if you want to see if it completed, but it works without the events

Ответ 2

   final FirebaseDatabase database = FirebaseDatabase.getInstance();
   masjeds = database.getReference("masjeds");

    // ** what is reference here? This must be masjeds **
    reference.child(masjed.getId()).setValue(masjed, new DatabaseReference.CompletionListener() {
    @Override
    public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
     //   Toast.makeText(MyMasjedsActivity.this, databaseError.getMessage(), Toast.LENGTH_SHORT).show();
    }
});

Я добавил свои выводы в качестве комментария выше, который я нашел в качестве подозреваемого, возможно, вы указываете на неправильную ссылку. Вы ориентируетесь на reference node, а masjeds node не используется. Пожалуйста, проверьте его и для лучшего понимания поместите базу данных firebase.

Ответ 3

Вы можете попробовать что-то вроде этого, чтобы обновить дочерние элементы определенного node с содержимым вашего HashMap:

// get a reference to the node that you want to update
DatabaseReference masjedToUpdate = masjeds.child(masjed.getId());
// pass your hashmap to its "updateChildren" method
masjedToUpdate.updateChildren(masjed.toMap());

Обратите внимание, что этот подход по-прежнему немного нестандартен по нескольким причинам. Но он должен выполнить эту работу для вас.

Ответ 4

Обновление FireBase с помощью

mDatabase.child("masjed").child("the_key_of_child_you_want_to_update").setValue(masjedObject);

будет работать нормально, он не создаст нового дочернего

Вы можете проверить My demo here