2016-08-12 14 views
1

私にはアクティビティとCourseDetailsというモデルがあります。Android - 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がスローされます。しかし、もし私がtextview1.setText(getData)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が呼び出され、それらのデータベース参照にデータが変更された場合は、 (変更の他に、このメソッドは常に最初に呼び出されます)。

そして、これは非同期 起こるので、我々はデータがFirebaseからretreivedされ、 は、私の知る限り、Androidのメインスレッドは、私たちまで保留または一時停止することができないかどうかわからないので、ヌルが発生した最初のケ​​ースでAndroidで非同期タスクを使用している理由のデータを取得します。 したがって、特定の更新やデータ変更に関するタスクを実行する最善の方法は、onDataChangeメソッド内にあると思います。したがって、あなたが述べたように、 は、onDataChange内でこれらの変更を行うか、onDataChangeから他のメソッドを呼び出して行うことができます。

アダプターを使用している場合は、アダプターにonDataChangeの変更について通知してください。また、他の選択肢、つまりFirebaseRecyclerAdapterを確認することもできます。 これは特別な手間をかけずに自動的にアップデートを処理します。

+0

もう一度openSource。ありがとう。もしそうなら、あるノードから 'ArrayList A 'にデータを取り出して保存し、別のノードからデータを取り出して' ArrayList B'に保存したいのであれば、 'ArrayList'の後に' ArrayList'の両方にデータを保持する方法を提案できますか? EventListener'が削除されましたか? –

+0

'ArrayLists'の両方のデータは、後で比較のために使用されます –

+0

こんにちは、私はかなりよく理解していませんが、' EventListener'が削除された後は、データが変更されるたびに 'ArrayLists'を更新したくない? – 0p3n5ourcE

関連する問題