2016-06-05 6 views
1

필자는 Firebase을 처음 사용 했으므로 테이블에서 데이터를 검색하기위한 쿼리에 도움이 필요합니다. 현재 파이어 볼트에서 필요한 데이터에 액세스하여 검색 할 수 있지만 문제는 문제입니다.Android 용 Firebase - 필요한 경우 데이터 검색을위한 이벤트 처리기를 만드는 방법?

내가 본 모든 것에서 firebase 데이터베이스를 사용하면 Query 또는 DatabaseReference 객체에 이벤트 리스너를 추가해야합니다. 질문 내용을 표시하는 메서드가 호출되기 전에 "questions"라는 노드의 내용을 다운로드하려고합니다. 그러나 데이터를 다운로드하는 이벤트의 발생 타이밍을 제어 할 수 없습니다. 따라서 결과로 표시 방법 firebase 이벤트가 발생하기 전에 항상 호출됩니다.

원하는 경우 쿼리를 실행하고 코드의 특정 섹션을 실행하기 전에 쿼리가 완료되도록하려면 어떻게해야합니까? 나는 당신이 쿼리를 실행하고 그 결과를 얻은 다음 당신의 로직으로 전진하는 전통적인 RDB에 익숙하다. firebase로 이벤트 처리기를 사용해야하는 이유는 무엇입니까? firebase 참조 객체와 이벤트 핸들러의 정의를 onCreate()로 옮기고 내 표시 메소드를 호출하는 코드를 onStart()로 옮겼습니다. 아무런 성공없이 동일한 문제가 발생했습니다. 얻으려고하는 데이터는 변경되지 않으므로 처음에는 한 번만 다운로드하여 표시 방법을 사용할 수 있습니다.

다음은 루트의 하위 노드 인 "questions"노드의 이미지입니다. 나는 이것이 해결 얻을 수없는 경우

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // Get Firebase DB reference 
    firebase = FirebaseDatabase.getInstance(); 
    fdbRef = firebase.getReference("questions"); 

    // [START Question_event_listener] 
    fdbRef.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      // Get Questions object and use the values to update the UI 
      objQuestions = dataSnapshot.getValue(); 
      Log.w("Firebase:", "In Firebase ValueEventListener"); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      // Getting Questions failed, log a message 
      Log.w("Firebase Error:", "onCancelled:", databaseError.toException()); 
      Toast.makeText(ReviewActivity.this, "Failed to load question!", Toast.LENGTH_SHORT).show(); 
     } 
    }); 
    //. . . remaining onCreate logic removed for simplicity 
} //end of onCreate 

@Override 
public void onStart() { 
    super.onStart(); 

    // I moved this logic from onCreate to onStart but did not help... 
    // Firebase retrieve must execute before I call any of these 
    if (list_type == MainActivity.LIST_UNREVIEWED_DOCS) 
     displayNewReviewForm(); 
    else if (list_type == MainActivity.LIST_REVIEWS) 
     displayCompletedReview(); 
    else // (list_type == MainActivity.LIST_DRAFTS) 
     displayDraftReview(); 
} 

다른 대안이 검색 이동 될 수있다 : 내 중포 기지의 DB 여기

enter image description here

에 아이 "질문에"노드의 이미지 내 코드입니다 논리를 이전 활동으로 내 순서대로 전달하고 검색된 데이터를이 활동에 추가로 전달합니다.하지만 그런 일을해야한다는 것은 정말로 어리석은 일입니다. 나는 내가 필요로 할 때 DB로부터 데이터를 얻을 수 있어야한다고 생각할 것이다. 나에게 그것을주는 느낌이 들지 않을 때.

이 문제를 해결할 수 있도록 도와 주신 데 대해 감사드립니다.

답변

0

조금 더 살펴 본 후에 내가 가지고있는 문제에 대한 2 가지 가능한 해결책을 생각해 냈습니다.

  1. 제 첫 번째 질문은 이미 원래 질문지에 언급되었지만 제 의견에는 이상적이지 않습니다. 기본적으로 firebase 검색 로직을 이전 Android 활동에 재배치하고 검색된 데이터를 Extra에서 필요로하는 활동으로 전달합니다. 필자의 경우 데이터는 HashMap이므로 serialize 된 버전의 메서드를 사용하여 직렬화 된 내용을 원하는 Activity로 전달해야합니다.
  2. 최상의 솔루션은 훨씬 간단합니다.기본적으로 dataSnapshot.getValue()를 호출 한 직후 Firebase 이벤트 리스너의 onDataChange() 메소드 내부로 옮겨 놓은 onStart() 함수 (사용자 정의 디스플레이 메서드 호출)의 논리를 옮겼습니다. 이렇게하면 표시 방법을 호출하기 전에 데이터를 얻을 수 있습니다. 이것은 현재 잘 작동하고있는 것 같습니다.
0

코드가 처음에는 모든 데이터가 포함 된 스냅 샷 데이터를 다운로드하고 Firebase에서는 적시에 데이터를 다운로드 할 수 없으며 다른 참조를 통해서만 수행 할 수 있습니다.

나는 DatabaseReference가 각각 q01, q02이고 필요시 데이터를 호출 할 것을 제안합니다.

키 "q01", "q02"가 시나리오에서보고있는 정적 인 경우.

question_one = firebase.getReference("q01"); 
question_two = firebase.getReference("q02"); 
question_three = firebase.getReference("q03"); 


//Once you have the reference, you can call their ValueListeners respectively 
question_one.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     // Get Questions object and use the values to update the UI 
     objQuestions = dataSnapshot.getValue(); 
     Log.w("Firebase:", "In Firebase ValueEventListener"); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     // Getting Questions failed, log a message 
     Log.w("Firebase Error:", "onCancelled:", databaseError.toException()); 
     Toast.makeText(ReviewActivity.this, "Failed to load question!", Toast.LENGTH_SHORT).show(); 
    } 
}); 
+0

안녕하세요 Tanishq - 질문 경로 아래에 약 20 개의 q ## 노드가 있습니다. 필요에 따라 더 추가 할 수 있으며 필요에 따라 활성화/비활성화 할 수있는 "활성화 된"속성이 있습니다. 그래서 고정 된 참조 20 개를 정적으로 코딩하는 것은 내 요구에 맞을 것처럼 들리지 않습니다. 더 중요한 것은 Firebase가 필요로 할 때 (즉, 디스플레이 로직이 발생하기 전에) 쿼리 나 검색을 실행하지 않는 문제를 제거하는 방법으로 참조 레이어 하나를 만드는 것이 어떻게되는지 이해할 수 없습니다. 결국 같은 문제가 생기는 것처럼 보입니다. 내가 놓친 게 있니? – IvanH

+0

레이어를 내려 놓음으로써 생성되는 유일한 차이점은 모든 데이터를 다운로드하지 않는다는 것입니다. 고정 된 참조에서 리스너를 호출하면 자식 리스너를 모두 다운로드합니다. 따라서 리스너를 초기화 할 때 첫 번째 인스턴스에서는 데이터와 함께 모든 하위 노드를 다운로드합니다. –

+0

Firepoint의 구조에 대한 베스트 프랙티스 및 Ref 포인트 아래의 모든 것을 다운로드하는 방법을 알고 있습니다. 깊은 질문이 아닌 질문 데이터를 구체적으로 구조화했습니다. 나는 구조 또는 나의 참조 점이 문제라고 생각하지 않는다. 그것은 검색의 타이밍입니다. 제 경우 엔, 안드로이드가 Firebase Ref & 이벤트 로직을 포함하고있는 Activity의 onCreate를 호출하고 있습니다. 그러면 onStart가 호출되어 디스플레이 메소드가 호출되어 사용자 정의 어댑터를 채우고 데이터 내용을 listview에 표시합니다. 그러나 Firebase는 빈 목록보기를 표시 할 때까지 실제로 검색을 시작하지 않습니다. – IvanH