2016-08-12 7 views
1

활동 및 모델이 CourseDetails입니다.안드로이드 - Firebase에서 검색된 데이터를 보존하십시오.

String getData; 
DatabaseReference mRef = FirebaseDatabase.getInstance().getReference().child("courses").child("Business"); 
mRef.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     CourseDetails c = dataSnapshot.getValue(CourseDetails.class); 
     getData = c.getCourseName(); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 
}); 

textview1.setText(getData); 

위의 코드를 사용하면 위의 마지막 줄에 NullPointerException이 표시됩니다. 그러나 을 ValueEventListener에 넣으면 getData = c.getCourseName() 아래의 데이터를 올바르게 표시 할 수 있습니다.

방법 작동이 SharedPreferences이거나 public void display(String data) { textview1.setText(data); }과 같은 방법으로 데이터를 설정하고 있음을 발견했습니다. 그러나 데이터가 ValueEventListener 외부에 있더라도 검색된 데이터를 유지하는 다른 방법은 무엇입니까?

예를 들어 ArrayList에 추가 된 데이터를 보존하고 싶습니다.

ArrayList<String> listData; 
DatabaseReference mRef = FirebaseDatabase.getInstance().getReference().child("courses").child("Business"); 
mRef.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for (DataSnapshot ds : dataSnapshot.getChildren()) { 
     CourseDetails c = dataSnapshot.getValue(CourseDetails.class); 
     String code = c.getCourseCode(); 
     String name = c.getCourseName(); 
     String CodeName = code + " " + name; 

     listData.add(CodeName); 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 
}); 

// data in ArrayList should be able to display here 
StringBuilder builder = new StringBuilder(); 
for (String s : listData) { 
    builder.append(s + "\n"); 
} 

textview1.setText(builder.toString()); 

이런 종류의 지속성을 달성하는 방법은 무엇입니까?

답변

2

Firebase는 특정 데이터가 수정 될 때 특정 참조 (데이터베이스 참조 : addValueEventListener가 추가 된 곳)에 첨부 된 모든 데이터 수신기를 알려줄 것입니다. 즉 onDataChange이 호출 될 때 해당 데이터베이스 참조에 데이터가 수정 될 때 (수정 외에도 메소드가 항상 처음 호출됩니다)입니다.

그리고 이것은 비동기 발생, 그래서 우리는 데이터가 중포 기지에서 입수해온되고 는 내가 아는 한, 안드로이드의 메인 쓰레드가 우리 때까지 보류 또는 일시 정지 될 수 있는지 여부를 알 수 없기 때문에 널 (null)이 발생하는 첫 번째 경우 Android에서 비동기 작업을 사용하는 이유에 대한 데이터를 수집합니다. 데이터 변경시 특정 업데이트 또는 작업을 수행하는 가장 좋은 방법은 onDataChange 방법 내에 있다고 생각합니다. 따라서 명시된 것처럼 일 수도 있고 onDataChange 내에서 변경을 수행하거나 onDataChange에서 다른 메소드를 호출하여 수행 할 수 있습니다.

또는 어댑터를 사용하는 경우 어댑터에 변경 사항을 onDataChange까지 알리는 메시지입니다. 또한 다른 선택 사항, 즉 FirebaseRecyclerAdapter을 살펴볼 수 있습니다. 추가 작업없이 자동으로 업데이트를 처리합니다.

+0

안녕하세요 다시 openSource입니다. 감사. 그렇다면 하나의 노드에서 데이터를 검색하여 'ArrayList A'에 저장하고 다른 노드에서 데이터를 검색하여'ArrayList B '에 저장하려면'ArrayList '뒤에'ArrayLists' 두 데이터를 유지하는 방법을 제안 할 수 있습니까? EventListener'가 제거 되었습니까? –

+0

두 ArrayLists의 데이터가 나중에 비교를 위해 사용됩니다 –

+0

안녕하세요, 꽤 이해가 잘 안되네요.'EventListener'가 제거 된 후에 않습니다. 데이터가 수정 될 때마다 ArrayLists가 업데이트되기를 원하지 않는다는 것을 의미합니다 ? – 0p3n5ourcE

관련 문제