在我的社交应用中,我想将所有用户ID添加到我的朋友或家庭成员的“地图字段”中。 因此,当某人接受朋友的请求时,他们文档的请求映射字段都将更新。
这想要这样:
Users:
---User1:
----requests{
-----user2:friend
-----user3:friend
-----user4:family
}
---User2:
----requests{
-----user1:friend
-----user3:friend
-----user4:family
}
我添加了此代码
final DocumentReference dr4 = db.collection("Users").document(UserID);
dr4.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()){
DocumentSnapshot ds = task.getResult();
if(ds!=null){
Object obj = ds.getData().get("requests");
Map<String,Object> setter2 = (HashMap<String, Object>) obj;
if(setter2==null){
setter2 = new HashMap<>();
}
Map<String,Object> request = new HashMap<>();
request.put(ProfileUserID,"family");
setter2.put("requests", request);
batch.update(dr4,setter2);
}
当第一个用户添加到请求中时,此方法效果很好。但是,当添加第二个用户时,它会像这样被弄乱:
Users:
---User1:
----user4:family
----requests{
-----user2:friend
}
曾经是朋友并且在请求内的旧用户现在退出了请求,并成为了自己的新字段,而新朋友进入了请求内。 我在做什么错了?
编辑1 经过一些调整。现在,我可以在请求映射中添加所有用户ID。 但是现在,如果我在地图上有1个条目,然后再添加一个,则较旧的条目会在地图外被复制
此代码为:
db.collection("Users").document(ProfileUserID).get()
.addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if(task.isSuccessful()){
Map<String, Object> abc = (Map<String, Object>)task.getResult().getData().get("requests");
if (abc==null){
abc = new HashMap<>();
}
Map<String,Object> req = new HashMap<>();
req.put(UserID,"family");
abc.put("requests",req);
db.collection("Users").document(ProfileUserID)
.set(abc,SetOptions.merge())
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful()){
db.collection("Users").document(UserID).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if(task.isSuccessful()) {
Map<String, Object> abc2 = (Map<String, Object>)task.getResult().getData().get("requests");
if (abc2 == null) {
abc2 = new HashMap<>();
}
Map<String, Object> req = new HashMap<>();
req.put(ProfileUserID, "family");
abc2.put("requests", req);
db.collection("Users").document(UserID).set(abc2,SetOptions.merge());
答案 0 :(得分:0)
我认为语句ds.getData().get("requests")
返回:{ user4:family }
,
并将其分配给setter2
。
正在使用值request
创建{ user2:friend }
映射,并使用put
方法(即{ request: { user2:friend } }
)将其添加到上面。这样的创建结构是这样的:
{ user4:family, requests { user2:friend } }
我想这是结构错误的原因。我没有游乐场来测试它,但是我认为这应该起作用:
if(ds!=null){
Object obj = ds.getData().get("requests");
Map<String,Object> setter2 = new HashMap<>();
Map<String,Object> request = new HashMap<>();
request.put((HashMap<String, Object>) obj)
request.put(ProfileUserID,"family");
setter2.put("requests", request);
batch.update(dr4,setter2);
}
我敢肯定,这只是解决问题的众多方法之一。
答案 1 :(得分:0)
我没有将Map
db.collection("Users").document(ProfileUserID).update("family",FieldValue.arrayUnion(UserID))