2016-11-17 3 views
1

그래서 나는 여러 다른 사용자를 수용 할 수있는 간단한 firebase android 응용 프로그램을 보유하고 있습니다. 사용자가 등록하고 작성시 해당 Uid는 'UserType'및 'IsCurrentlyTracking'값을 갖는 Uid 아래에 UserInformation 항목과 함께 사용자 테이블에 저장됩니다. 사용자가 로그인하면 프로필 활동으로 이동하여 버튼을 눌러 앱을 계속 진행할 수 있습니다. 내 테이블 구조는 다음과 같습니다. Android - Firebase; 로그인하면 데이터를 검색하고 (계층화 된) 해당 데이터를 기반으로 해당 사용자를 리디렉션합니다.

계속을 누르면 UserInformation 데이터가 검색됩니다. 해당 데이터를 기반으로 다른 활동으로 리디렉션됩니다. 앞에서 설명한 작업을 수행하는 대신 응용 프로그램이 중지되거나 중단됩니다. 정보가 저장되지 않았더라도 (단지 사용자의 UID 아래)는 '사용자'테이블에, 내가 전에 데이터를 검색 할 수있게되었습니다

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

: 여기

는 사용자를 리디렉션 코드/방법 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에 대한 참조를 얻는 것이 좋습니다. 파이어베이스 경로를 연결하는 데 "+"를 사용하지 말 것을 제안합니다.

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를 멤버 변수로 유지하면이 작업을보다 쉽게 ​​수행 할 수 있습니다. ,보다 완전한 예를 들어

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

동일한 데이터베이스 조직을 사용하여 내가 만든 일 목록 응용 프로그램을 체크 아웃 :

또한

하는 사용자는 자신의 데이터에 대한 액세스를 강화하기위한 적절한 중포 기지 규칙을 설정해야 패턴 here. 희망이 있으면 도움을받을 수 있었고 다른 질문이 있거나 뭔가 명확하지 않은 경우 자유롭게 의견을 말할 수있었습니다.

+2

답변 해 주셔서 감사합니다. 나는 구조 조정을하고 내가 어떻게 시작하는지 보게 될 것이다. 또한 데이터베이스 규칙에 대한 액세스 강화에 감사드립니다. –