繁体   English   中英

Firebase - 为什么列表大小始终为 0(尝试将键添加到事件侦听器内的列表时)

[英]Firebase - Why is list size always 0 (when trying to add key to list inside event listener)

我正在尝试在我的数据库中存储多个位置列表。 我希望键遵循一种模式,例如“LocationList 1”、“LocationList 2”等。

为此,我创建了一个列表来保存所有键。 首先,我想检查数据库中是否有任何孩子。 如果没有,我想添加一个名为“LocationList 1”的孩子并将该字符串存储在我的列表中。 如果已经有一个具有该名称的孩子(意味着我的列表大小不是 0),那么我想添加一个名为“LocationList <此处列表中的项目数 + 1>”的键。 但是我的逻辑中的某些东西是错误的,因为列表大小始终为 0。

这是我检索所有密钥的方法:

    private void getKeysList() {

        databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {

                if(snapshot.hasChildren()) {
                    locationKeysString.add(snapshot.getKey());;
                }

            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
    }

这是我将位置列表添加到数据库的方法:

public Task<Void> addLocation(List<Location> locationList, Context context) {

        getKeysList();
        int itemNumber = locationKeysString.size();
        String keyValue = new String();
        Task<Void> task;

        if (itemNumber == 0) {
            keyValue = "LocationList " + 1;
            locationKeysString.add(keyValue);
            task = databaseReference
                    .child(keyValue)
                    .setValue(locationList)
                    .addOnSuccessListener(new OnSuccessListener<Void>() {
                        @Override
                        public void onSuccess(Void unused) {
                            Toast.makeText(context, R.string.add_to_database_success, Toast.LENGTH_SHORT).show();
                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Toast.makeText(context, R.string.add_to_database_failure, Toast.LENGTH_SHORT).show();
                        }
                    });
        } else {
            keyValue = "LocationList " + (itemNumber + 1);
            locationKeysString.add(keyValue);
            task = databaseReference
                    .child(keyValue)
                    .setValue(locationList)
                    .addOnSuccessListener(new OnSuccessListener<Void>() {
                        @Override
                        public void onSuccess(Void unused) {
                            Toast.makeText(context, R.string.add_to_database_success, Toast.LENGTH_SHORT).show();
                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Toast.makeText(context, R.string.add_to_database_failure, Toast.LENGTH_SHORT).show();
                        }
                    });
        }

        return task;
    }

但是当我运行我的应用程序时,它会不断将位置添加到数据库中的单个位置列表“LocationList 1”中: 在此处输入图像描述

永远不会创建“LocationList 2”。

我还尝试了以下方法:

    private void getKeysList() {
        
        databaseReference.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
                
                locationKeysString.add(snapshot.getKey());
            }

           [...]);
    }

但列表大小仍为 0。

我究竟做错了什么? 除此之外,有什么方法可以改进我的代码吗?

谢谢你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM