FireStore继续取代字段 - Android

时间:2018-02-22 15:44:46

标签: android firebase firebase-realtime-database google-cloud-firestore

我有一项活动,在用户创建帐户(身份验证)后,它会自动在FireStore中的用户文档中放置complete_profile=true。为了给你更多的视角,这就是我的firestore的样子:

users <-- Collection
  |
  A8as7f9aKsrYas12l7 <--- User's ID/Document
         |
         complete_profile: "true" <-- Field

现在,我有另一个名为completeprofileactivity的网页。它要求用户的名字。之后,我想在用户的数据name: "sample name"中添加另一个字段。问题是,在添加名称后,complete_profile消失了:

users 
  |
  A8as7f9aKsrYas12l7 
         |
         name: "sample name" <-- replaced?

当我再次使用同一个用户重新创建一个新帐户时,它应该添加complete_profile权限吗?所以我会同时拥有namecomplete_profile。但相反,我又得到了这个:

users 
  |
  A8as7f9aKsrYas12l7 
         |
         complete_profile: "true" <-- it replaced the "name" again

我的完整个人资料中包含此代码:

Boolean userdoComplete = true;
String str_userid = mAuth.getCurrentUser().getUid();

Map<String, String> user_map = new HashMap<>();
    user_map.put("complete_profile",userdoComplete.toString());

    mFirestore.collection("users").document(str_userid).set(user_map).addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
                                if(task.isSuccessful()){
                                    //Registered Successfully
                                    //Intent to Main Activity
                                    Intent goMain = new Intent(SignUpActivity.this, MainActivity.class);
                                    startActivity(goMain);

                                } else {

                                }
                            }
                        });

并添加姓名:

String str_userid = mAuth.getCurrentUser().getUid();
Map<String, String> specialMap = new HashMap<>();
        specialMap.put("name", name);
        mFireStore.collection("users").document(str_userid).set(specialMap).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()){
                    //All is Successful - Proceed
                    Toast.makeText(AddSpecialActivity.this, "Successful!", Toast.LENGTH_SHORT).show();

                } else {
                    //FireStore Error
                    Toast.makeText(AddSpecialActivity.this, "There was an Error. Please Try Again.", Toast.LENGTH_LONG).show();
                }
            }
        });

我不明白为什么一个人不断替换另一个人。它应该添加complete_profilename

2 个答案:

答案 0 :(得分:1)

正如您所注意到的,此代码:

mFireStore.collection("users").document(str_userid).set(specialMap)

该代码段替换了str_userid引用的文档中的所有内容。这当然是预期的行为,因为您文档设置为specialMap。他们可以轻松解决此问题,即使用merge() SetOption

mFireStore.collection("users").document(str_userid).set(specialMap, SetOptions.merge())

有关详细信息,请查看Firestore documentation here

答案 1 :(得分:0)

set替换整个文档。您应该考虑使用update调用来更新或向现有文档添加字段。

https://firebase.google.com/docs/firestore/manage-data/add-data#update-data