加载两个依赖数据集

时间:2016-06-25 13:28:57

标签: android firebase firebase-realtime-database

我在我的活动的onCreate函数中加载了两个数据集:

protected void onCreate(Bundle savedInstanceState) {
    ....

    mDatabase.child("users").child(userId).addListenerForSingleValueEvent(
        new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                currentUser = dataSnapshot.getValue(Users.class);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Log.w(TAG, "error:", databaseError.toException());
            }
    });
    mDatabase.child("events").child(userId).addListenerForSingleValueEvent(
        new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                ...
                event = dataSnapshot.getValue(Events.class);
                if (event.getHost().equals(currentUser.getId()) {
                      ....
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Log.w(TAG, "error:", databaseError.toException());
            }
    });
    String name = currentUser.getName();
    ....
}

所以我需要事件数据集中的用户数据集的一些数据。大部分时间都有效,但由于它们被称为异步,因此它们有时会以错误的顺序加载。因此,在加载用户之前加载事件。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

如果您想保证订单,您可以将事件的加载嵌套到用户的回调中:

String name;
mDatabase.child("users").child(userId).addListenerForSingleValueEvent(
    new ValueEventListener() {
        public void onDataChange(DataSnapshot dataSnapshot) {
            currentUser = dataSnapshot.getValue(Users.class);
            name = currentUser.getName();
            mDatabase.child("events").child(userId).addListenerForSingleValueEvent(
                new ValueEventListener() {
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        ...
                        event = dataSnapshot.getValue(Events.class);
                        if (event.getHost().equals(currentUser.getId()) {
                              ....
                        }
                    }

                    public void onCancelled(DatabaseError databaseError) {
                        Log.w(TAG, "error:", databaseError.toException());
                    }
            });
        }

        public void onCancelled(DatabaseError databaseError) {
            Log.w(TAG, "error:", databaseError.toException());
        }
});

嵌套变得有点深,但是如果你将事件加载到一个单独的(命名的)方法中,那通常会再次变得更好。