2016-08-11 19 views
-1

Firebaseデータベースのデータを更新および削除しようとしています。Android - Firebaseデータベースのデータを更新して削除する

SectionDetailsモデル

public class SectionDetails { 
    private String sectionCode; 
    private String sectionSeats; 
    private String sectionKey; 

public SectionDetails() { 
} 

public SectionDetails(String sectionCode, String sectionSeats) { 
    this.sectionCode = sectionCode; 
    this.sectionSeats = sectionSeats; 
} 

@Exclude 
public String getSectionKey() { 
    return sectionKey; 
} 

public String getSectionCode() { 
    return sectionCode; 
} 

public String getSectionSeats() { 
    return sectionSeats; 
} 
} 

FirebaseHelperクラス

public class FirebaseHelper { 
     DatabaseReference db; 
     ArrayList<SectionDetails> sectionDetailsArrayList = new ArrayList<>(); 

public FirebaseHelper(DatabaseReference db) { 
    this.db = db; 
} 

private void fetchData(DataSnapshot dataSnapshot) { 

    SectionDetails sectionDetails = dataSnapshot.getValue(SectionDetails.class); 
    sectionDetailsArrayList.add(sectionDetails); 

    adapter.notifyDataSetChanged(); 
} 

public ArrayList<SectionDetails> retrieve() { 
    db.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      fetchData(dataSnapshot); 
     } 

     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
      fetchData(dataSnapshot); 
     } 

     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 
      adapter.notifyDataSetChanged(); 
     } 

     @Override 
     public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
    return sectionDetailsArrayList; 
} 
} 

CustomAdapterクラス

public class CustomAdapter extends BaseAdapter { 
     DatabaseReference updateRef; 
     String key; 
     Context c; 
     ArrayList<SectionDetails> sectionDetailsArrayList; 

public CustomAdapter(Context c, ArrayList<SectionDetails> sectionDetailsArrayList) { 
    this.c = c; 
    this.sectionDetailsArrayList = sectionDetailsArrayList; 
} 

@Override 
public int getCount() { 
    return sectionDetailsArrayList.size(); 
} 

@Override 
public Object getItem(int position) { 
    return sectionDetailsArrayList.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    final SectionDetails sd = (SectionDetails) this.getItem(position); 

    updateRef = FirebaseDatabase.getInstance().getReference().child(Constants.FIREBASE_COURSES).child("sections"); 

    convertView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      final Dialog d = new Dialog(CustomAdapter.this); 
      d.setContentView(R.layout.section_custom_dialog); 

      Button btnUpdate = (Button) d.findViewById(R.id.btnUpdate); 
      Button btnDelete = (Button) d.findViewById(R.id.btnDelete); 

      btnUpdate.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         final String code = "1B"; 
         final String seats = "20"; 

         updateRef.addValueEventListener(new ValueEventListener() { 
             @Override 
             public void onDataChange(DataSnapshot dataSnapshot) { 
              for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 
               SectionDetails updateSD = snapshot.getValue(SectionDetails.class); 
               if (sd.getSectionCode().equals(updateSD.getSectionCode())) { 
                key = snapshot.getKey().toString(); 
               } 
              } 

             SectionDetails newSD = new SectionDetails(code, seats); 
             updateRef.child(key).setValue(newSD); 
             } 

             @Override 
             public void onCancelled(DatabaseError databaseError) { 

             } 
            }); 

        } 
      }); 

      btnDelete.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 

           updateRef.addValueEventListener(new ValueEventListener() { 
            @Override 
            public void onDataChange(DataSnapshot dataSnapshot) { 
             for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 
              SectionDetails deleteSD = snapshot.getValue(SectionDetails.class); 
              if (sd.getSectionCode().equals(deleteSD.getSectionCode())) { 
               updateSectionRef.child(snapshot.getKey().toString()).removeValue(); 
               break; 
              } 
             } 
             adapter.notifyDataSetChanged(); 
            } 

            @Override 
            public void onCancelled(DatabaseError databaseError) { 

            } 
           }); 
        } 
       }); 

      d.show(); 
     } 
    }); 


    return convertView; 
} 
} 

MainActivityクラス

public class MainActivity extends AppCompatActivity { 

DatabaseReference mRef; 
FirebaseHelper helper; 
CustomAdapter adapter; 
ListView lvSectionsListOne; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

lvSectionsListOne = (ListView) findViewById(R.id.lvSectionsList); 

mRef = FirebaseDatabase.getInstance().getReference().child(Constants.FIREBASE_COURSES).child("sections"); 
helper = new FirebaseHelper(mRef); 

adapter = new CustomAdapter(this, helper.retrieve()); 
lvSectionsListOne.setAdapter(adapter); 
} 
} 

期待どおりにデータがデータベースから削除されますが、削除されるデータはlistviewの内部に残ります。私はadapter.notifyDataSetChanged()を追加しましたが、まだlistviewは更新していません。

データも期待通りに更新されますが、updateボタンをクリックすると、データは無限に更新されます。私はlistviewと同様に、データベースがデータを追加し続けるのを見ることができ、アプリケーションを閉じることによってのみ停止することができます。

私は外forループにSectionDetails newSD = new SectionDetails(code, seats)updateRef.child(key).setValue(newSD)を移動しようとしたが、鍵がforループ外のパスに渡されていないため、データは更新されません。

+0

私はdownvoterではありません。しかし、誰もが効率的に手助けできるようにするにはあまりにも多くのコードがここにあります。これを「最小限の完全な複製」(http://stackoverflow.com/help/mcve)に減らしてください。誰かが助けてくれる可能性が高くなります。 –

+0

私に言ってくれてありがとう。私は質問から無関係のコードを削除しました。 –

+1

私はここで人々が答える代わりに下投票するのが大好きだと思う。 – FaisalAhmed

答えて

0

投稿したコードをすべて熟読していないため、処理が完全に理解できない場合があります。あなたが説明した問題のいくつかを引き起こしているかもしれない2つのことがあります。

​​は、fetchData()を呼び出し、変更されたセクションの詳細を配列リストに追加します。再度追加するのではなく、既存のセクションの詳細を更新してはいけませんか?また、onChildRemoved()では、セクションの詳細はアレイリストから削除されません。彼らを取り除く必要はありませんか?

CustomAdapterボタンのクリックリスナーには、匿名を追加しますValueEventListeners。それらは匿名であるため、不要になったときに削除する方法はありません。 ValueEventListenersにはaddValueEventListener()remain active until removedが追加されています。あなたの目標がデータを一度取得する場合は、addListenerForSingleValueEvent()を使用してください。

+0

ありがとう。 fetchData()の部分に関する提案に従ってください。今すぐコードが動作しています –

関連する問題