使用Firebase展平结构,如何检索索引键列表?

时间:2016-10-11 13:15:59

标签: android firebase firebase-realtime-database

在Firebase中,应用扁平化数据结构的原则时解释了here

如果我在他们的例子中使用了结构:

  // Chats contains only meta info about each conversation
  // stored under the chats's unique ID
  "chats": {
    "one": {
      "title": "Historical Tech Pioneers",
      "lastMessage": "ghopper: Relay malfunction found. Cause: moth.",
      "timestamp": 1459361875666
    },
    "two": { ... },
    "three": { ... }
  },

  // Conversation members are easily accessible
  // and stored by chat conversation ID
  "members": {
    // we'll talk about indices like this below
    "one": {
      "ghopper": true,
      "alovelace": true,
      "eclarke": true
    },
    "two": { ... },
    "three": { ... }
  },
  "users": {
    "ghopper": {
      "name": "user_name",
      "age": 28
    },
    "alovelace": { ... },
    "eclarke": { ... }
  }
}

让我们说我想要显示频道one的成员列表及其所有详细信息。这意味着我必须首先检索位置members/one处的所有子项,然后逐个查询每个用户ID。

这意味着如果我想在回收站视图中显示它们,检索数据是异步的,用户体验可能不是最好的:

在我的情况下,这将是一个类似的实现:

@Override
    public void onBindViewHolder(final UserViewHolder viewHolder, int position) {
    //getKey(position) just retrieve the key of current member in my adapter array
          FirebaseDatabase.getInstance().getReference("users").child(getKey(position)).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                User user = dataSnapshot.getValue(User.class);
                viewHolder.setName(user.getName());
                viewHolder.setPersonAge(user.getAge());
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

这不太理想,但我看不到另一种方法。在启动活动之前加载每个成员会引入一个问题,即知道何时从数据库中检索了所有用户配置文件。

欢迎任何建议。

0 个答案:

没有答案