3

firebase 실시간 데이터베이스를 사용하여 데이터를 정렬하고 필터링하려고합니다. 한 경우에는 OrderByKey를 사용하고 싶습니다. (데이터를 정렬하기 위해 먼저 새 질문이 필요하고 푸시 기능을 사용하여 키가 생성됩니다.) 다른 경우에는 OrderByChild를 사용하고 있습니다 (왜냐하면 타임 스탬프를 사용하여 정렬하기 때문에이 경우에는 ' push를 사용하지만 사용자의 uid를 키로 사용).OrderByKey는 정상적으로 작동하지만 OrderByChild는 firebase 실시간 데이터베이스에서 예기치 않은 결과를 나타냅니다.

두 경우 모두 가장 최근의 일/사람 (질문/사용자)이 먼저 필요하므로 내림차순으로 순서를 지정해야합니다 (클라이언트 쪽에서도 그 반대입니다). 그래서 첫 번째 쿼리 후 쿼리 방법입니다. 첫 번째 쿼리는 아래에 표시된 쿼리에 endAt(endAtKey) 부분이 없습니다. OrderByKey를 들어

: OrderByChild를 들어

ref.child("questions").orderByKey().endAt(endAtKey).limitToLast(10); 


    //data at questions node looks like this 
    { 
    "-L1CbnCkXJiRT9MKpoP1" : { 
    "mCorrectAnswer" : 1, 
    "mOptionA" : "ueud", 
    "mOptionB" : "h", 
    "mOptionC" : "h", 
    "mOptionD" : "h", 
    "mProblem" : "4shsudududududududurududu" 
    }, 
    "-L1Dd9x6ws5di2rf8yay" : { 
    "mCorrectAnswer" : 1, 
    "mOptionA" : "sh", 
    "mOptionB" : "shsh", 
    "mOptionC" : "hehs", 
    "mOptionD" : "hssh", 
    "mProblem" : "12ffsnsjsjdbxbddhdbdbddjebddb" 
    } 

:

mDatabaseReference.child("user_list").orderByChild("mTimeStamp") 
         .endAt(endAtKey).limitToLast(10); 



    //data at user_list reference looks like this 
    { 
    "VH78axip1bXN9dktsF4Az0oBche2": 
    "mTimeStamp": "1508782492973", 
    "mUserName": "Satyam Kumar" 
    }, 
    "2MedW9KSYTcB8I1qp0xcoNuwPEf1": 
    "mTimeStamp": "1508823085614", 
    "mUserName": "Thirunagari Yeshwanth" 
    } 

내가 너무 onDataChange 10 그룹의 데이터와 RecyclerView을 채우려는 내가 처음의 키를 저장 아이가 onDataChange 방법으로 받았습니다.

 if (countCopy == 1) { // while iterating through children this variable tells 
//the index of the loop. 

           endAtKey = currentKey; 
           Log.e("endKey", endAtKey); 
          } 

지금 내가 직면하고있는 문제는 OrderByKey 쿼리 (수신 된 데이터가 예상된다에도 효과가있을 것이다) 그러나 endAtKey 항상 OrderByChild 쿼리에 대해 동일 나는 endAtKey 벌금을 수신하고 위의 쿼리를 사용하여 데이터의 후속 페치에 수신되는 데이터는 항상 동일합니다. 이 문제를 어떻게 해결할 수 있습니까?

+0

'OrderByChild' 쿼리에서 로그를 볼 때'endAtKey'는 uid 또는 timestamp입니까? –

+0

@ RosárioPereira 그것은 타임 스탬프입니다. 오, 당신 의견에 문제가 있다고 생각합니다. Uid와 함께 해보겠습니다. :) –

+0

@ RosárioPereiraFernandes 나는 이전의 코멘트에서 잘못 말했다. 내가 사용하고있는 것은 Uid이다. 그래서 우리는 timeStamp를 사용해야한다고 생각합니다. 왜냐하면 그것이 우리가 질의를하기 때문입니다. 타임 스탬프를 다시 확인하겠습니다. –

답변

3

OrderByChild 쿼리의 문제점은 timestamp 대신 키가 endAtKey 인 것입니다. OrderByChild가 timestamp 속성에 대해 쿼리하는 데 사용되고 있으므로 endAtKey은 타임 스탬프 여야하며 키가 아니어야합니다.