如何从与 Firebase 数据库同步的 ArrayList 中删除条目?

Posted

技术标签:

【中文标题】如何从与 Firebase 数据库同步的 ArrayList 中删除条目?【英文标题】:How to remove entry from ArrayList in sync with Firebase Database? 【发布时间】:2019-04-04 14:44:24 【问题描述】:

我有一个数据库:

我有一个 ArrayList usersListUsersOnlineClass:

public class UsersOnlineClass 

    private String muserName;

    public UsersOnlineClass(String userName) 
        muserName = userName;
    
    public String getmuserName() 
        return muserName;
    

我有一个代码可以在用户在线时将他们添加到usersList

onlineViewersCountRef.addChildEventListener(new ChildEventListener() 
    ArrayList<UsersOnlineClass> usersList = new ArrayList<>();
    UsersOnlineAdapter usersAdapter = new UsersOnlineAdapter(Chat.this, usersList);
    ListView lv = findViewById(R.id.usersList);
    @Override
    public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) 
        usersList.add(new UsersOnlineClass(dataSnapshot.getValue().toString()));
        lv.setAdapter(usersAdapter);
        Toast.makeText(Chat.this, String.valueOf(usersList.size()), Toast.LENGTH_SHORT).show();
    

它工作正常。

但我不知道如何在 usersList 离线时删除用户。我试过这段代码:

        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) 
            String deletedUser = dataSnapshot.getValue().toString();
            int i;
            for (i = 0; i < usersList.size(); i++) 
                if (usersList.get(i).equals(deletedUser)) 
                    usersList.remove(i);
                
            

但它不起作用,该位置没有从usersList中删除。字符串deletedUser 等于usersList 中的位置之一(例如,Micle),可以,但位置没有被删除。

请帮助我。 如何从 ArrayList 中删除与 Firebase 数据库同步的条目?

【问题讨论】:

你想从数据库中删除用户还是从ArrayList删除用户? 从用户离线时删除firebase条目,它可以工作。我需要从 arraylist 中删除相同的条目。 删除后您是否尝试使用adapter.notifyDataSetChanged()?还将breakpoint 放在usersList.remove(i) 上,检查编译器是否会命中breakpoint 是的,我正在尝试。通过调试,我看到该位置没有被删除。 【参考方案1】:

我认为问题的部分原因是:usersList.get(i).equals(deletedUser) - 这会返回一个您想要与String 进行比较的对象,因此if 语句中的代码块永远不会执行,因为equals 失败。因此,您需要比较两个相同 type 的(自定义)对象,或者您可以将 StringString 进行比较,例如:

public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) 
        UsersOnlineClass deletedUser = dataSnapshot.getValue(UsersOnlineClass.class);
        for (int i = 0; i < usersList.size(); i++) 
            if (usersList.get(i).getmuserName().equals(deletedUser.getmuserName())) 
                usersList.remove(i);
            
        

【讨论】:

哦,谢谢,它有效。我做了你建议的同样的事情,在你回答前几秒钟:)

以上是关于如何从与 Firebase 数据库同步的 ArrayList 中删除条目?的主要内容,如果未能解决你的问题,请参考以下文章

如何同步 Firebase 存储和数据库?

如何将firebase与react功能组件同步?

主库down机,从库切换为主库的步骤

如何从与数据透视相关的行中获取 Builder 对象 - Laravel

Firebase 保存数据方法异步或同步

如何通过 iOS(swift)将 Firebase Auth 与 MySQL DB 同步?