【问题标题】:Data being added as new instead of updating firebase firestore数据被添加为新数据,而不是更新 firebase firestore
【发布时间】:2021-06-12 04:22:45
【问题描述】:

我正在尝试使用 updatedata 方法在 firestore 中更新数据,但由于某种原因,不是更新数据,而是使用我应该更新的数据创建了一个新用户,我没有明白为什么,我已经坚持了几个小时,任何帮助都将不胜感激,这是我保存数据或更新数据的类:

public class Admin_add extends AppCompatActivity {
    public static final String TAG = "TAG";
    EditText mFullName, mEmail, mPassword, mPhone;
    Button mAddBtn,leaveAdd;
    FirebaseAuth fAuth;
    ProgressBar progressBar;
    FirebaseFirestore fStore;/*db*/
    String UserID;
    Button showall;
    private String uName,uEmail,uPhone,uPassword;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_admin_add);
        mFullName = findViewById(R.id.fullName1);
        mEmail = findViewById(R.id.Email1);
        mPassword = findViewById(R.id.password1);
        mPhone = findViewById(R.id.phone1);
        mAddBtn = findViewById(R.id.adduserbtn);
        leaveAdd=findViewById(R.id.leaveadd);
        showall=findViewById(R.id.showallbtn);
        fAuth = FirebaseAuth.getInstance();
        progressBar = findViewById(R.id.progressBar);
        fStore = FirebaseFirestore.getInstance();
        Bundle bundle=getIntent().getExtras();
        if(bundle!=null){

            mAddBtn.setText("update");
            uName=bundle.getString("uName");
            uEmail=bundle.getString("uEmail");
            uPhone=bundle.getString("uPhone");
            uPassword=bundle.getString("uPassword");
            mFullName.setText(uName);
            mPhone.setText(uPhone);
            mEmail.setText(uEmail);
            mPassword.setText(uPassword);


        }else{

            mAddBtn.setText("save");
        }

        leaveAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(getApplicationContext(),AdminAct.class));
                finish();
            }
        });
        showall.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(getApplicationContext(),Crud_users.class));
            }
        });


        mAddBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final String email = mEmail.getText().toString().trim();
                final String password = mPassword.getText().toString().trim();
                final String fullname = mFullName.getText().toString();
                final String phone = mPhone.getText().toString();

                if (TextUtils.isEmpty(email)) {
                    mEmail.setError("Email Is Required.");
                    return;
                }
                if (TextUtils.isEmpty(password)) {
                    mPassword.setError("Password Is Required.");
                    return;
                }
                if (password.length() < 8) {
                    mPassword.setError("Password must be>=8 characters");
                }
                progressBar.setVisibility(View.VISIBLE);
                Bundle bundle1=getIntent().getExtras();
                if(bundle1!=null){
                    String id=UserID;

                    updateToFireStore(fullname,email,password,phone);
                }else{
                    fAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {
                            if (task.isSuccessful()) {
                                Toast.makeText(Admin_add.this, "user created", Toast.LENGTH_SHORT).show();
                                UserID = fAuth.getCurrentUser().getUid();

                                DocumentReference documentReference = fStore.collection("users").document(UserID);
                                Map<String, Object> user = new HashMap<>();
                                user.put("fName", fullname);
                                user.put("email", email);
                                user.put("phone", phone);
                                user.put("Password", password);
                                //specify if user is admin
                                user.put("isUser", "1");
                                documentReference.set(user).addOnSuccessListener(new OnSuccessListener<Void>() {
                                    @Override
                                    public void onSuccess(Void aVoid) {
                                        Log.d(TAG, "OnSuccess: user profile is created for" + UserID);

                                    }
                                }).addOnFailureListener(new OnFailureListener() {
                                    @Override
                                    public void onFailure(@NonNull Exception e) {
                                        Log.d(TAG, "Failure" + e.toString());
                                    }
                                });
                                progressBar.setVisibility(View.INVISIBLE);


                            } else {
                                Toast.makeText(Admin_add.this, "ERROR" + task.getException().getMessage(), Toast.LENGTH_SHORT).show();

                            }

                        }
                    });

                }
                //register to firebase

            }
        });

    }

    private void updateToFireStore(String fullname, String email, String password, String phone) {
        UserID = fAuth.getCurrentUser().getUid();
         fStore.collection("users").document(UserID).update("email",email,"Password",password,"fName",fullname,"phone",phone)
                .addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        if(task.isSuccessful()){
                            Toast.makeText(Admin_add.this, "data updated", Toast.LENGTH_SHORT).show();
                        }else{
                            Toast.makeText(Admin_add.this, "Error"+task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                        }

                    }
                }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(Admin_add.this, e.getMessage().toString(), Toast.LENGTH_SHORT).show();
            }
        });
    }
}

我认为updatetofirestore 方法的某个地方有问题,这是我的适配器类:

public class UsersAdapter  extends RecyclerView.Adapter<UsersAdapter.MyViewHolder> {
    private Crud_users activity;
    private List<usersmodel> mList;
    public UsersAdapter(Crud_users activity,List<usersmodel> mList){
        this.activity=activity;
        this.mList=mList;
    }

    public  void updateData(int position){
        usersmodel item=mList.get(position);
        Bundle bundle=new Bundle();
        bundle.putString("uName",item.getfName());
        bundle.putString("uEmail",item.getEmail());
        bundle.putString("uPhone",item.getPhone());
        bundle.putString("uPassword",item.getPassword());
        Intent intent=new Intent(activity,Admin_add.class);
        intent.putExtras(bundle);
        activity.startActivity(intent);



    }
    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View v= LayoutInflater.from(activity).inflate(R.layout.list_item_single,parent,false);
        return new MyViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        holder.name.setText(mList.get(position).getfName());
        holder.email.setText(mList.get(position).getEmail());
        holder.phone.setText(mList.get(position).getPhone());
        holder.isuser.setText(mList.get(position).getIsUser());


    }

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

    public  static class MyViewHolder extends RecyclerView.ViewHolder{
        TextView name,email,phone,isuser;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            name=itemView.findViewById(R.id.list_name);
            email=itemView.findViewById(R.id.list_email);
            phone=itemView.findViewById(R.id.list_phone);
            isuser=itemView.findViewById(R.id.list_isuser);
        }
    }
}

我真的不知道我已经尽力了。

【问题讨论】:

  • 你的updateToFireStore() 被触发了吗?
  • @AlexMamo 是的,它是在 if 条件内触发的
  • 那样的话,确实是触发了更新操作吧?是否显示 Toast 消息?

标签: java android firebase google-cloud-firestore firebase-authentication


【解决方案1】:

我认为您应该更改将值传递给 firebase 的 update() 方法的方式。

fStore.collection("users").document(UserID).update("email",email,"Password",password,"fName",fullname,"phone",phone)

正确的方法是传递一个ma​​p。下面是例子:

Map<String, Object> data = new HashMap<String, Object>();
data.put("email", email);
data.put("Password", password);
data.put("fName", fullname);
data.put("phone", phone);

fStore.collection("users").document(UserID).update(data);

您可以使用 Firebase 的 set() 方法和 SetOptions.merge() 作为替代方案,这比 update() 更好,因为update() 仅在存在时更新字段,其中 set() 使用 SetOptions.merge() 将更新现有字段并创建 if它不存在。 阅读更多关于它的信息here

Map<String, Object> data = new HashMap<String, Object>();
data.put("email", email);
data.put("Password", password);
data.put("fName", fullname);
data.put("phone", phone);

fStore.collection("users").document(UserID).set(data, SetOptions.merge());

【讨论】:

  • OP使用更新操作的方式没有问题。根据docs,它会工作得很好。
  • 我已经尝试了这两种方法,但出现以下错误:java.lang.NullPointerException: Provided document path must not be null. at com.google.firebase.firestore.util.Preconditions.checkNotNull(Preconditions.java:147) at com.google.firebase.firestore.CollectionReference.document(CollectionReference.java:103) at net.smallacademy.authenticatorapp.Admin_add.updateToFireStore(Admin_add.java:174)
  • 您的参考资料中的某些内容很可能为空。检查您使用的值是否为 null。
猜你喜欢
  • 1970-01-01
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 2019-10-12
  • 2020-05-05
  • 2023-02-04
  • 2021-05-04
  • 2011-05-08
相关资源
最近更新 更多