如何从Firebase实时数据库中检索唯一密钥

时间:2019-01-29 12:49:54

标签: android firebase firebase-realtime-database

我收到此错误,因为我使用unique key函数,所以我认为它无法从firebase中读取push()。实际上,它有一个来自用户的唯一ID,在其下还有一个由推功能生成的唯一ID。

  

W / ClassMapper:在课程上找不到-LX96YLmx5G_w8yEDTgi的设置程序/字段   com.official.roomv1.Caller.Advertise       在com.official.roomv1.Caller.Advertise类上找不到-LX95gJQNfc9sN81LY3_的设置器/字段       在com.official.roomv1.Caller.Advertise类上找不到-LX95T40zIbRfCRmZpFo的设置器/字段。

这是针对android应用的。它可以读取push()函数中未使用唯一键的其他数据。

public DatabaseHelper() {
    firebaseDatabase = FirebaseDatabase.getInstance();
    reference = firebaseDatabase.getReference("Property");
}

public void readProperty(final DataStatus dataStatus){
    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            property.clear();
            List<String> keys = new ArrayList<>();
            for (DataSnapshot keyNode : dataSnapshot.getChildren()){
                keys.add(keyNode.getKey());
                Advertise advertise = keyNode.getValue(Advertise.class);
                property.add(advertise);
            }
            dataStatus.DataIsLoaded(property,keys);
        }

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

        }
    });

}

这是我当前的数据库测试

enter image description here

2 个答案:

答案 0 :(得分:0)

我看不到您在哪里使用 push()。但是您必须从那里获取按下键。

以下是获取按键的方法:

String pushID= reference.push().getKey();

然后,您在这里进行更新:

reference.pushID.addValueEventListener(new ValueEventListener() { ..... }

您添加了推送ID,就可以使用特定的方式来处理数据。希望你能理解。

答案 1 :(得分:0)

您的JSON似乎具有两个嵌套级别:

  1. UID
  2. 推送ID

因此,基本上,您似乎为每个用户提供了一个属性列表。这意味着您的代码需要两个循环:一个循环用于用户,一个循环用于该用户的属性。

在代码中:

public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    property.clear();
    List<String> propertyKeys = new ArrayList<>();
    for (DataSnapshot userSnapshot : dataSnapshot.getChildren()){
        for (DataSnapshot propertySnapshot : userSnapshot.getChildren()){
            propertyKeys.add(propertySnapshot.getKey());
            Advertise advertise = propertySnapshot.getValue(Advertise.class);
            property.add(advertise);
        }
    }
    dataStatus.DataIsLoaded(property, propertyKeys);
}