2016-11-17 9 views
1

私は単純なfirebaseアンドロイドアプリケーションを持っています。これはいくつかの異なるユーザを対象にしています。 ユーザーが登録し、作成時に、Uidはユーザーテーブルに格納され、UserInformationエントリにはUidの下に値 'UserType'と 'IsCurrentlyTracking'が格納されます。 ユーザーがサインインすると、Profileアクティビティが表示され、ボタンを押してアプリを通じて続行できます。 私のテーブル構造は次のとおりです。 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の下で)「ユーザーのテーブルに格納されていませんでしたが、私は、前のデータを取得することができましたUserInformationは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とlistenerを保持すると、これが簡単になります。また

、唯一の自分のデータにアクセスするユーザーを硬化させるために適切なFirebaseルールを設定してください:

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

より完全例えば、同じデータベースの組織を使用して私が作ったToDoリストアプリをチェックアウトパターンhere。私はあなたが他の質問をしている場合、または何かが不明な場合は、お手伝いでき、コメントしてもらえました。

+2

答えていただきありがとうございます。私は再構築し、どのように乗り越えるかを見ていきます。また、データベースルールのアクセス強化にも感謝します。 –

関連する問題