【问题标题】:how to make sure Query is not empty如何确保查询不为空
【发布时间】:2016-08-10 10:30:09
【问题描述】:

我的应用程序包含多种类型的用户,例如 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));
            }

但没有一个也被输入

我该如何解决这个问题

谢谢

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

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

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

    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 数据库中很常见。

    【讨论】:

    • 仍然没有工作我只是添加了 if (dataSnapshot.exists()) { 以确保 startActivity 溢价
    • 除了我不能只说明付款状态,因为每个人都有非常不同的东西,几乎没有共同点
    【解决方案2】:

    我通过向每个用户添加一个 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());
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 2011-05-02
      • 2021-11-29
      • 2016-03-23
      相关资源
      最近更新 更多