如何确保Query不为空

时间:2016-08-10 00:03:43

标签: java android firebase firebase-realtime-database

我有一个应用程序,有许多类型的用户,如normalUser,PremiumUser

并且为了定义我在firebasedatabase中使用他们唯一的UID到他们的类别溢价或正常的每个

这是我的数据库firebase形状

--users
-----normal
-----premium

因此,如果用户选择普通帐户,他将被分配到正常

对我来说,这是他登录后如何抓取他的数据如下

if (auth.getCurrentUser() != null) {
        finish();
        Query q = FirebaseDatabase.getInstance().getReference().child("users").child("normal").equalTo(auth.getCurrentUser().getUid());
        Query q2 = FirebaseDatabase.getInstance().getReference().child("users").child("premium").equalTo(auth.getCurrentUser().getUid());
        if (q != null) {
            q.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                        startActivity(new Intent(Login.this, Normal.class));
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        } else {
            q2.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                        startActivity(new Intent(Login.this, Premium.class));
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        }
    }

但看起来代码输入了两个活动,以确保此帐户仅存在于某个类别中(正常或高级)

我尝试使用

if (dataSnapshot.getChildrenCount()>0) //none of both activities is entered
if (dataSnapshot != null)//both Activites still entered
if(dataSnapshot.getValue(Premium.class)!=null)//vvvv
if(dataSnapshot.getValue(Normal.class)!=null)//but still none entered

我也试过

Query q = FirebaseDatabase.getInstance().getReference().child("users").child("normal").equalTo(auth.getCurrentUser().getUid());
final Query q2 = FirebaseDatabase.getInstance().getReference().child("users").child("premium").equalTo(auth.getCurrentUser().getUid());
q.addValueEventListener(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {
    if (dataSnapshot.exists()) {
        startActivity(new Intent(Login.this, Normal.class));
    }
    else {
        q2.addValueEventListener(new ValueEventListener() {
            public void onDataChange(DataSnapshot dataSnapshot) {
              if (dataSnapshot.exists()) {
                startActivity(new Intent(Login.this, Premium.class));
            }

但也没有输入

我该如何解决?

感谢

2 个答案:

答案 0 :(得分:0)

您的查询永远不会为空,因为您之前就创建了它。如果没有附加监听器,就无法知道查询有多少结果。

因此,当前数据结构最接近的是嵌套查询:

Query q = FirebaseDatabase.getInstance().getReference().child("users").child("normal").equalTo(auth.getCurrentUser().getUid());
Query q2 = FirebaseDatabase.getInstance().getReference().child("users").child("premium").equalTo(auth.getCurrentUser().getUid());
q.addValueEventListener(new ValueEventListener() {
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) {
            startActivity(new Intent(Login.this, Normal.class));
        }
        else {
            q2.addValueEventListener(new ValueEventListener() {
                public void onDataChange(DataSnapshot dataSnapshot) {
                    startActivity(new Intent(Login.this, Premium.class));
                }
                public void onCancelled(DatabaseError databaseError) {
                    throw databaseError.toException();
                }
            });
        }
    }
    public void onCancelled(DatabaseError databaseError) {
       throw databaseError.toException();
    }
});

更直接的方法是更改​​您的数据结构,以便包含每个用户的付款状态。所以也存储:

user_payment_status
  uid1: "normal"
  uid2: "premium"

然后,您只需使用单个值侦听器查找当前用户的状态即可。您将保留当前列表,因为您可能还希望在应用中的某个位置显示所有高级用户的列表。

以这种方式复制数据在NoSQL数据库中很常见。

答案 1 :(得分:0)

我通过向每个用户添加一个uid然后更改

来修复它
 Query q = FirebaseDatabase.getInstance().getReference().child("users").child("normal").equalTo(auth.getCurrentUser().getUid());
 Query q2 = FirebaseDatabase.getInstance().getReference().child("users").child("premium").equalTo(auth.getCurrentUser().getUid());

以下

 Query q = FirebaseDatabase.getInstance().getReference().child("users").child("normal").orderByChild("uid").equalTo(auth.getCurrentUser().getUid());
 Query q2 = FirebaseDatabase.getInstance().getReference().child("users").child("premium").orderByChild("uid").equalTo(auth.getCurrentUser().getUid());

我仍然不知道为什么第一种方式是错误的