firebase android studio,firebase数据库子数组操作

yyyllmsg  于 2023-05-07  发布在  Android
关注(0)|答案(1)|浏览(164)

我有一个函数,应该添加一个房间(自定义对象)到我的数据库:Java - Android Studio

public void addRoom(Room room) {
    this.addRoomToList(room);
    DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference("/users/" + FirebaseAuth.getInstance().getUid() + "/rooms");

    dbRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            ArrayList<HashMap<String, Object>> data = (ArrayList<HashMap<String, Object>>)dataSnapshot.getValue();

            if (data == null){
                data = new ArrayList<>();
            }

            data.add(room.getHashMapFromRoom());
            // Save the updated subarray to Firebase
            dbRef.setValue(data);

            dbRef.removeEventListener(this);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.w(TAG, "onCancelled", databaseError.toException());
            dbRef.removeEventListener(this);
        }
    });
}

该函数接受一个房间参数,检索当前房间数组,将新房间添加到数组,并将数组添加到数据库。但是,它不会工作,第一次它是好的,将上传和更新成功,但当第二次调用它将擦除房间(因为数据库中的数据为空,它将创建一个新的数组)。我该怎么解决?
注意:我还检查了这个rooms参数的父参数,这意味着数据库中有更高的层次结构,我能够读取它并获得一个散列表,但是特定的rooms数组没有出现在那里。此外,我确实检查了,我在数据库的规则部分有读/写权限。

2vuwiymt

2vuwiymt1#

经过几个小时的调试,我想这一定是因为我一个接一个地调用这个函数,所以数组没有时间在数据库中更新。我写了这个,我知道这不是理想的,但它的工作...
下面是更新后的函数:

public void addDevice(Device device, int room_idx){
    this.devices.add(device);

    Thread addDevice = new Thread(new Runnable() {
        @Override
        public synchronized void run() {
            // Path: " + room_idx + "/devices"
            final boolean[] roomExistsInIdx = {false};
            while (!roomExistsInIdx[0]){
                DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference("users/" + FirebaseAuth.getInstance().getUid()).child("rooms");
                dbRef.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                        ArrayList<Object> rooms = (ArrayList<Object>)snapshot.getValue();
                        int size;
                        if(rooms == null){
                            size = 0;
                        }
                        else{
                            size = rooms.size();
                        }
                        if (size - 1 >= room_idx){
                            if (device.getType() == Device.TYPES.AIR_CONDITIONER){
                                dbRef.child(room_idx + "/devices/" + device.getName()).setValue((AirConditioner)device);
                            }
                            else if(device.getType() == Device.TYPES.LIGHTS){

                            }
                            else if (device.getType() == Device.TYPES.TV){

                            }
                            roomExistsInIdx[0] = true;
                            dbRef.removeEventListener(this);
                            return;
                        }
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError error) {
                        Log.d("cancel", "cancel");
                        return;
                    }
                });

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }
    });
    addDevice.start();
}

相关问题