我有一项活动,在用户创建帐户(身份验证)后,它会自动在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
权限吗?所以我会同时拥有name
和complete_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_profile
和name
。
答案 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