2016-08-11 2 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, а также база данных продолжает добавлять данные и может быть остановлена ​​только закрытием приложения.

Я попытался пошевелиться SectionDetails newSD = new SectionDetails(code, seats) и updateRef.child(key).setValue(newSD) к внешним for цикла, но данные не обновляется, потому что ключ не передается по пути вне цикла for.

+0

Я не являюсь нисходящим. Но здесь есть слишком много кода, чтобы кто-нибудь мог эффективно помочь. Уменьшите это до [минимального, полного воспроизведения] (http://stackoverflow.com/help/mcve), и у вас будет больше шансов, что кто-то поможет. –

+0

Спасибо, что сказал мне. Я удалил ненужные коды из вопроса. –

+1

Я думаю, что люди здесь любят голосовать, а не отвечать – FaisalAhmed

ответ

0

Я не полностью просмотрел весь код, который вы опубликовали, и может полностью не понимать вашу обработку. Есть две вещи, которые могут вызвать некоторые проблемы, которые вы описали.

В FirebaseHelper, метод onChildChanged() вызывает fetchData(), который добавляет детали измененного раздела в список массивов. Не следует ли обновлять существующие разделы, а не добавлять их снова? Кроме того, в onChildRemoved() детали раздела не удаляются из списка массивов. Не нужно ли их удалять?

В CustomAdapter прослушиватели кликов для ваших кнопок добавляют анонимный ValueEventListeners. Поскольку они анонимны, у вас нет способа удалить их, когда они больше не нужны. ValueEventListeners добавлено с addValueEventListener()remain active until removed. Если ваша цель - получить данные один раз, используйте addListenerForSingleValueEvent().

+0

Спасибо. Следуя вашему предложению относительно части fetchData(). Теперь код работает –

Смежные вопросы