how to make sure Query is not empty

爷,独闯天下 提交于 2019-12-25 09:14:52

问题


i have an application with many types of users like normalUser,PremiumUser

and in order to define that i use their unique UID in firebasedatabase to each one in their category premium or normal

this is my database firebase shape

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

so if user choose normal account he will be assigned to normal only

for me this is how to grab his data later when he log in is as follows

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) {

                }
            });
        }
    }

but looks like the code enter both activities altough for sure this account exists in one of categories only(normal or premium)

i tried using

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

i also tried

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));
            }

but none of them was entered too

how can i fix that

thanks


回答1:


Your query will never be null, because you created it just before that. There is no way to know how many results a query has without attaching a listener.

So the closest you can get with your current data structure is to nest the queries:

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();
    }
});

A more direct way to make this work is to change your data structure so that is also contains the payment status for each user. So also store:

user_payment_status
  uid1: "normal"
  uid2: "premium"

Then you can simply look up the status for the current user with a single value listener. You'll keep your current list around, since you likely also want to show a list of all premium users somewhere in the app.

Duplicating data in this way is quite common in NoSQL databases.




回答2:


i fixed it by adding to each user a uid then changed

 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());

to the following

 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());

i still dont know why the first way is wrong



来源:https://stackoverflow.com/questions/38862282/how-to-make-sure-query-is-not-empty

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!