gpt4 book ai didi

android - 删除对象时删除嵌套字段中的索引

转载 作者:行者123 更新时间:2023-11-29 01:15:40 25 4
gpt4 key购买 nike

我还在使用 Firebase,这次我有一个与删除对象相关的问题。

我的结构如下:

users: {
UsErId1:{
name: "Jack",
email: "m@i.l"
},
UsErId2: { + },
UsErId3: { + }
},
user_contacts: {
UsErId1:{
UsErId2: true,
UsErId3: true
},
UsErId2: {
UsErId1: true
}
}

所以如果我想删除一个用户,我必须:

  1. 删除用户对象
  2. 删除user_contacts分支下的用户对象
  3. 从 user_contacts 中删除指向该用户的所有索引

我的性能问题来自第 3 点,因为我需要迭代所有 user_contacts 条目以查看它是否存在于 child 中。

代码示例如下:

private void deleteUser(String userId) {

firebaseDatabase.getReference("users").child(userId).removeValue();
firebaseDatabase.getReference("users_contacts").child(userId).removeValue();
firebaseDatabase.getReference("users_contacts").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot usersSnapshot : dataSnapshot.getChildren()) {
for( DataSnapshot contactSnapshot : usersSnapshot.getChildren() ){
String contactId = contactSnapshot.getValue(String.class);
if( contactId.equals(userId) ){
contactSnapshot.getRef().removeValue();
}
}
}
}

@Override
public void onCancelled(DatabaseError databaseError) {

}
});

}

我想到了两种可能的解决方案:

  • 解决方案 1:不要从 user_contacts 中删除索引,当我必须加载用户联系人时,我必须调用每个用户查看用户是否为空(已被删除),在这种情况下,不要显示它。顺便说一句,这会导致数据库变脏。

  • 解决方案 2:创建一个反向索引 contacts_users,我在其中存储我尝试删除的用户所引用的用户。如下:

    contacts_user: {
    UsErId1: {
    UsErId2: true
    },
    UsErId2: {
    UsErId1: true
    },
    UsErId3: {
    UsErId1: true
    }
    }

所以,当我必须删除一个用户时,我会在 contacts_users 中查看它的 child ,并知道在其联系人中有它的每个用户,然后继续删除它(现在我可以知道整个路径)。在我看来,这似乎是一种更像 NoSql 的方法。

你怎么看?还有其他方法吗?

最佳答案

您的第二个解决方案是我建议的解决方案,无需搜索。您可以按用户存储该信息,但如果它变得太大,将其存储在其他地方会更好。

同样往另一个方向删除也变得容易。

关于android - 删除对象时删除嵌套字段中的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39850117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com