2016-11-17 59 views
1

因此,我有一个简单的firebase android应用程序,目的是为了满足不同用户的需求。 用户注册,并在创建时,其Uid存储在用户表中,以及其值为'UserType'和'IsCurrentlyTracking'的Uid下的UserInformation条目。 用户登录后会被带到一个配置文件活动,他们可以按一个按钮继续通过该应用程序。 这里是我的表结构: Android - Firebase;在登录时,检索数据(分层)并根据该数据重定向该用户

在按下继续时,它们的UserInformation数据被检索。根据这些数据,他们被重定向到另一项活动。 而不是做上述,应用程序停止/崩溃。

下面是代码/方法将用户重定向:

public void userRedirect(){ 

    firebaseAuth = FirebaseAuth.getInstance(); 
    user = firebaseAuth.getCurrentUser(); 

    final FirebaseDatabase database = FirebaseDatabase.getInstance(); 

    Query q = database.getReference("Users/" + user.getUid() + "/UserInformation"); 

    q.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) { 
       UserInformation uI = dataSnapshot.getValue(UserInformation.class); 
       int userType = uI.getUserType(); 
       boolean ICT = uI.getTrackingStatus(); 

       if ((userType == 1) && (!ICT)) { 

        finish(); 
        startActivity(new Intent(ProfileActivity.this, AllocationActivity.class)); 
       } 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      databaseError.getMessage(); 
     } 
    }); 
} 

我已经能够之前检索数据,尽管没有被存储的信息在“用户”表(只有在用户的UID)用户信息也没有从UiD下载。

对于一些额外的背景下,这是我的用户类:

public int UserType; 
public boolean IsCurrentlyTracking; 

public UserInformation(int userType, boolean IsCurrentlyTracking){ 
    this.UserType = userType; 
    this.IsCurrentlyTracking = IsCurrentlyTracking; 
} 

public int getUserType() 
{ 
    return UserType; 
} 

public boolean getTrackingStatus() 
{ 
    return IsCurrentlyTracking; 
} 

上,我可能会错误任何想法? 预先感谢您。

回答

1

我建议您使用FirebaseUI进行身份验证并获取对uid的引用。我还建议您不要使用“+”连接Firebase路径。试试这个:

private DatabaseReference databaseReference; 

... 

DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child(FirebaseAuth 
       .getInstance().getCurrentUser().getUid()).getRef(); 

,并添加一个监听器是这样的:

listener = new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 
       // handle UserInformation here 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }; 

databaseReference.addValueEventListener(listener); 

我喜欢,而不是分离它覆盖它里面的方法的原因是,那么我可以做的onDestroy如下:

@Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     databaseReference.removeEventListener(listener); 
    } 

将DatabaseReference和侦听器保存为成员变量可以使这更容易。

此外,一定要设置相应的火力地堡规则硬化用户只访问他们的数据:

{ 
    "rules": { 
    "$uid": { 
     ".write": "$uid === auth.uid", 
     ".read": "$uid === auth.uid", 
    } 
    } 
} 

对于一个更完整的示例,请查阅待办事项列表程序,我做它使用相同的数据库组织模式here。希望我能够提供帮助,如果您有任何其他问题或者不清楚,请随时发表评论。

+2

谢谢你的回答Faraz。我会重组,看看我如何继续。另外,感谢数据库规则中的访问强化。 –

相关问题