当我尝试从 firebase 更新数据时出错

Error when i try to update data from firebase

我想使用我的应用程序从 firebase 更新一些数据,但是当我提交它时,数据只会重复,不会更改,而且不知道为什么。我把我的代码放在下面:

我的 class userPojo

 package com.example.proyectofinaldanielsanchez;

import java.io.Serializable;

public class userPojo implements Serializable {

private String Tipo;
private String Titulo;
private String Avance;
private String Plataforma;
private String Key;

public userPojo() {

}
public userPojo(String Tipo, String Titulo, String Avance, String Plataforma){
    this.Tipo=Tipo;
    this.Titulo=Titulo;
    this.Avance=Avance;
    this.Plataforma=Plataforma;
}

public String getTipo() {
    return Tipo;
}

public void setTipo(String Tipo) {
    this.Tipo = Tipo;
}

public String getKey() {
    return Key;
}

public void setKey(String Key) {
    this.Key = Key;
}

public String getTitulo() {

    return Titulo;
}

public void setTitulo(String Titulo) {
    this.Titulo = Titulo;
}

public String getAvance() {
    return Avance;
}

public void setAvance (String Avance) {
    this.Avance = Avance;
}



public String getPlataforma() {
    return Plataforma;
}

public void setPlataforma(String Plataforma) {
    this.Plataforma = Plataforma;
}

}

Class 适配器:

 package com.hellokh.sovary.firetest;

  import android.content.Context; 
  import android.content.Intent;
   import android.view.LayoutInflater;
    import android.view.View;
   import android.view.ViewGroup;
 import android.widget.PopupMenu;
 import android.widget.Toast;

  import androidx.annotation.NonNull;
 import androidx.recyclerview.widget.RecyclerView;

  import java.util.ArrayList;

  public class RVAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
{
private Context context;
ArrayList<Employee> list = new ArrayList<>();
public RVAdapter(Context ctx)
{
    this.context = ctx;
}
public void setItems(ArrayList<Employee> emp)
{
    list.addAll(emp);
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
{
    View view = LayoutInflater.from(context).inflate(R.layout.layout_item,parent,false);
    return new EmployeeVH(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position)
{
    Employee e = null;
    this.onBindViewHolder(holder,position,e);
}

public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position, Employee e)
{
    EmployeeVH vh = (EmployeeVH) holder;
    Employee emp = e==null? list.get(position):e;
    vh.txt_name.setText(emp.getName());
    vh.txt_position.setText(emp.getPosition());
    vh.txt_option.setOnClickListener(v->
    {
        PopupMenu popupMenu =new PopupMenu(context,vh.txt_option);
        popupMenu.inflate(R.menu.option_menu);
        popupMenu.setOnMenuItemClickListener(item->
        {
            switch (item.getItemId())
            {
                case R.id.menu_edit:
                    Intent intent=new Intent(context,MainActivity.class);
                    intent.putExtra("EDIT",emp);
                    context.startActivity(intent);
                    break;
                case R.id.menu_remove:
                    DAOEmployee dao=new DAOEmployee();
                    dao.remove(emp.getKey()).addOnSuccessListener(suc->
                    {
                        Toast.makeText(context, "Record is removed", Toast.LENGTH_SHORT).show();
                        notifyItemRemoved(position);
                        list.remove(emp);
                    }).addOnFailureListener(er->
                    {
                        Toast.makeText(context, ""+er.getMessage(), Toast.LENGTH_SHORT).show();
                    });

                    break;
            }
            return false;
        });
        popupMenu.show();
    });
}

@Override
public int getItemCount()
{
    return list.size();
}
}

Class 存档:

   package com.example.proyectofinaldanielsanchez;


import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.HashMap;
import java.util.Map;

public class Archivos extends AppCompatActivity  {


protected void onCreate(Bundle savedInstanceState)
{
    
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_archivos2);
    final EditText edit_tipo = findViewById(R.id.edit_tipo);
    final EditText edit_titulo = findViewById(R.id.edit_titulo);
    final EditText edit_avance=findViewById(R.id.edit_avance);
    final EditText edit_plataforma=findViewById(R.id.edit_plataforma);
    Button btn = findViewById(R.id.btn_submit);
    Button btn_open = findViewById(R.id.btn_open);
    btn_open.setOnClickListener(v->
    {
        Intent intent =new Intent(Archivos.this, Visualizar.class);
        startActivity(intent);
    });
    DAOUserPojo dao =new DAOUserPojo();
    userPojo user_edit = (userPojo) getIntent().getSerializableExtra("EDIT");
    if(user_edit !=null)
    {
        btn.setText("UPDATE");
        edit_tipo.setText(user_edit.getTipo());
        edit_titulo.setText(user_edit.getTitulo());
        edit_avance.setText(user_edit.getAvance());
        edit_plataforma.setText(user_edit.getPlataforma());

        btn_open.setVisibility(View.GONE);
    }
    else
    {
        btn.setText("SUBMIT");
        btn_open.setVisibility(View.VISIBLE);
    }
    btn.setOnClickListener(v->
    {
        userPojo user = new userPojo(edit_tipo.getText().toString(), edit_titulo.getText().toString(),edit_avance.getText().toString(),edit_plataforma.getText().toString());
        if(user_edit==null)
        {
            dao.add(user).addOnSuccessListener(suc ->
            {
                Toast.makeText(this, "Record is inserted", Toast.LENGTH_SHORT).show();
            }).addOnFailureListener(er ->
            {
                Toast.makeText(this, "" + er.getMessage(), Toast.LENGTH_SHORT).show();
            });
        }
        else
        {
          
            HashMap<String, Object> hashMap = new HashMap<>();
            hashMap.put("tipo", edit_tipo.getText().toString());
            hashMap.put("titulo", edit_titulo.getText().toString());
            hashMap.put("avance", edit_avance.getText().toString());
            hashMap.put("plataforma", edit_plataforma.getText().toString());
            dao.update(user_edit.getKey(), hashMap).addOnSuccessListener(suc ->
            {
                Toast.makeText(this, "Record is updated", Toast.LENGTH_SHORT).show();
                finish();
            }).addOnFailureListener(er ->
            {
                Toast.makeText(this, "" + er.getMessage(), Toast.LENGTH_SHORT).show();
            });
        }
    });


}
    }

classDAOUserPojo

     public class DAOUserPojo {

private DatabaseReference databaseReference;
private FirebaseAuth userid;

public DAOUserPojo() {
    FirebaseDatabase db =FirebaseDatabase.getInstance("https://proyecto-daniel-sanchez-default-rtdb.europe-west1.firebasedatabase.app");
    databaseReference = db.getReference();
    userid = FirebaseAuth.getInstance();


   // userid=FirebaseAuth.getInstance().getCurrentUser();
}
public Task<Void> add(userPojo user)
{
    return databaseReference.child(userid.getUid()).push().setValue(user);
}

public Task<Void> update(String Key, HashMap<String ,Object> hashMap)
{
    return databaseReference.child(userid.getUid()).child(Key).updateChildren(hashMap);
}
public Task<Void> remove(String Key)
{
    return databaseReference.child(userid.getUid()).child(Key).removeValue();
}

public Query get(String Key)
{
    if(Key == null)
    {
        return databaseReference.child(userid.getUid()).orderByKey().limitToFirst(8);
    }
    return databaseReference.child(userid.getUid()).orderByKey().startAfter(Key).limitToFirst(8);
}

public Query get()
{
    return databaseReference;
}
}

这是我尝试更新时数据库的节点。它应该像第一个节点,但它重复了:firebase 抱歉我的英语不好。如果有人能提供帮助,那就太好了,谢谢!

让我们开始上传新的:

我建议添加额外的 child lets name is id 例如,此 child 的值将与 firebase push id 的值相同。

让我们开始编辑:

为适配器传递一个(字符串)textId 变量,这样当您从菜单中单击编辑时,它会将 textId 值设置为来自 firebase 的推送 ID,即 child 有您需要编辑的数据。

现在使用 child(textId).updateChildren(//Your hashmap);

它会起作用。

我的用法示例:

String textId= productRef.child(UID).child("images").push().getKey();


HashMap<String ,Object> hashMap = new HashMap<>();
        hashMap.put("image", url);
        hashMap.put("id", textId);

 productRef.child(UID).child("images").child(textId).updateChildren(hashMap);

它看起来像这样:

你有没有注意到 id 与 Child 名称相同