2017-04-11 2 views
0

기본적으로 내 문제는 firebase db에 여러 속성을 가진 사용자 목록을 저장했다는 것입니다. 그 중 일부는 개인 정보이므로 일부 항목에 대한 액세스를 거부하려고했습니다. 규칙은 필터로 사용할 수 없기 때문에 답변이 아닙니다.android의 고급 firebase 어댑터

내 솔루션은 "사용자"에 대해 "pvt"(개인) 및 "pb"(공개)의 두 가지 새로운 속성을 만들고 그 내부에 올바른 속성을 저장하는 것이 었습니다.

내가 먼저 사용 새 사용자를 만들려면 :

newUserPublic 및 newUserPrivate 사용자의 특성 (공공 다른 하나는 개인 정보에 대한 기타)에 대한 getter와 setter를 제공하고 간단한 사용자 정의 클래스의 객체
mDatabase.child("users").child(prefs.getString("id firebase", " ")).child("public").setValue(newUserPublic); 
mDatabase.child("users").child(prefs.getString("id firebase", " ")).child("private").setValue(newUserPrivate); 

.

최종 목표는 각 사용자의 공용 속성 만 사용하는 리더 보드를 만드는 것이지만이 구성으로 적절한 ListAdapter를 만들지 못했습니다.

내 마지막 시도가 사용자

public class User { 

public UserDataPrivate getPvt() { 
    return pvt; 
} 

public void setPvt(UserDataPrivate pvt) { 
    this.pvt = pvt; 
} 

public UserDataPublic getPb() { 
    return pb; 
} 

public void setPb(UserDataPublic pb) { 
    this.pb = pb; 
} 

private UserDataPrivate pvt; 

private UserDataPublic pb; 

public void setId(String id) { 
    this.id = id; 
} 

private String id; 

public User(String id, UserDataPublic pb, UserDataPrivate pvt){ 
    this.pvt=pvt; 
    this.pb=pb; 
    this.id=id; 
} 

}

가 새로운 사용자를 만들라고하는 새로운 클래스를 만드는 것이 었습니다 :

User user = new User(newUserPublic, newUserPrivate); 
mDatabase.child("users").child(prefs.getString("id firebase", " ")).setValue(user); 

현재 어댑터를

DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference("users"); 
    Query query = mDatabase.child("pb").orderByChild("points"); 
    ListAdapter adapter = new CustomFirebaseAdapter<User>(this, User.class, R.layout.list_item, query) { 
     @Override 
     protected void populateView(View v, User model, int position) { 
      //code that uses model.getPb() 
     } 
    }; 
입니다

작동하지 않습니다 (// 코드는 실행되지 않습니다).

어떻게 해결할 수 있습니까?

IMG

편집 : 쿼리 내부 사용자 PB/점수를 시도하지만 충돌

는 중포 기지에서 테스트 사용자입니다. 문제는 firebase가 복잡한 객체를 처리 할 수 ​​없다거나 뭔가를 놓치고 있다는 것입니다. 사용하는 단일 사용자 데이터를 검색하는 다른 코드 부분이 있습니다.

final DatabaseReference userDatabase = mDatabase.child("users").child(prefs.getString("id firebase", " ")); 

    userDatabase.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      User user = dataSnapshot.getValue(User.class); 
      //... 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

사용자를 설정할 때 충돌이 발생합니다. 사용자 개체를 사용하여 db에 사용자를 저장하면 같은 방식으로 검색 할 수 있다고 생각했지만 틀렸을 것입니다.

답변

1

위치에 orderByChild()을 호출하면 Firebase는 해당 위치에서 각 노드를 직접 가져 와서 지정한 하위 노드에서 주문합니다. /usersorderByChild("points")을 호출하기 때문에 /users 아래의 노드를 가져와 해당되지 않는 points 속성에서 주문합니다.

pb/points 속성으로 각 사용자를 주문하려면 orderByChild()으로 전화 할 때 해당 경로를 사용하십시오. 따라서 :

DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference("users"); 
Query query = mDatabase.orderByChild("pb/points"); 
ListAdapter adapter = new CustomFirebaseAdapter<User>(this, User.class, R.layout.list_item, query) { 
    @Override 
    protected void populateView(View v, User model, int position) { 
     //code that uses model.getPb() 
    } 
}; 
+0

응용 프로그램이 충돌합니다! 나는 firebase가 복잡한 객체를 다룰 수 없다고 생각합니다. 첫 번째 게시물을 수정하여 코드 –

+0

을 게시합니다. 충돌이 발생하면 게시글에 stacktrace의 logcat을 포함하십시오. –

+0

당신이 나를 구 했어요! 사용자 클래스에 dataSnapshopt.getValue()가 필요하지 않다는 이유로 데이터가없는 매개 변수가있는 생성자가 없습니다. 이제 작동 중입니다. –

0

이 코드 :

DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference("users"); 
Query query = mDatabase.child("pb").orderByChild("points"); 

users/pb/??/points에 의해 /users/pb 순서를 가리 킵니다. /users/??을 가리키는 쿼리를 users/??/pb/points으로 찾으려면 Firebase이 지금 할 수 없다고 생각합니다. Check this post

+1

내 대답의 첫 번째 링크는 실제로이 질문에 대한 해결책을 가리 킵니다. 'pb/points'는 고정 된 경로이기 때문에'orderByChild ("pb/points")'를 사용하여 질의 할 수 있습니다. –

관련 문제