2016-12-24 2 views
0

Я пытаюсь удалить дочерний элемент из базы данных, установив уникальный ключ в значение null. Что я делаю - я нажимаю и удерживаю элемент списка, чтобы получить диалоговое окно оповещений, а затем нажмите, чтобы удалить выбранную запись. Проблема в том, что когда я извлекаю ключ, он возвращает мне все ключи. И ближе всего мне удалось зайти так далеко, чтобы удалить все из базы данных. Пожалуйста, проверьте мои снимки кода ниже:Как удалить выбранного ребенка в базе данных Firebase Android

mLocationListView.setLongClickable(true); 
    mLocationListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 

      AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this) 
        .setTitle("Delete a Location") 
        .setMessage("Do you want to delete your location?") 
        .setPositiveButton("Delete", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 

//Problem is here. if I exclude .child(pushKey)everything is deleted from the database. 
           DatabaseReference db_node = FirebaseDatabase.getInstance().getReference().getRoot().child("locations").child(pushKey); 

         db_node.setValue(null); 
         } 
        }); 
       AlertDialog alert = builder.create(); 
       alert.show(); 
      return true; 
     } 
    }); 

Вот как я извлекаю pushKey. Любые предложения, как это сделать более правильно? (Если есть один)

queryRef.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      locationCurrent = dataSnapshot.getValue(LocationCurrent.class); 
      mLocationAdapter.add(locationCurrent); 
      pushKey = dataSnapshot.getKey(); 
      Log.i("PUSH KEY ", pushKey); 

     } 

     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
      locationCurrent = dataSnapshot.getValue(LocationCurrent.class); 


     } 

     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 

     } 

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

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

Я думал положить ключ к базе данных, но нет никакого смысла и должна быть наиболее эффективным решением.

UPDATE:

Я попытался сделать это с другим методом прикрепляя слушатель событий одно значения для запроса, но она не работает, потому что я не могу определить, какой элемент списка я нажимаю на, так что я удалить всю базу данных. В принципе, мне нужно щелкнуть элемент списка и удалить его. Но это не работает. Я сделал именно так, как в ссылке здесь ниже:

How to delete from firebase realtime database?

Любые предложения?

+1

Так как пользователь нажал на конкретный пункт, вам нужно посмотреть этот пункт на этой позиции. Это часть функции адаптера. Непонятно, как это сделать в коде, но если вы используете «FirebaseListAdapter» (https://github.com/firebase/FirebaseUI-Android/tree/master/database#create-custom-firebaselistadapter- подкласс) это будет 'adapter.getRef (position) .removeValue()'. –

+0

Я использую пользовательский адаптер. Так что, я думаю, лучше изменить его на адаптер списка адресов только ради спасения от большей головной боли? –

+2

Вы можете придерживаться пользовательского адаптера. Но вам понадобится аналогичная логика, которая позволит вам искать «DatabaseReference» для элемента в позиции, которая была нажата. –

ответ

2

Добавьте переходную переменную, которая называется refKey в вашем LocationCurrent.class. Сохранить реф в onChildAdded

public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
    locationCurrent = dataSnapshot.getValue(LocationCurrent.class); 
    locationCurrent.setRefKey(dataSnapshot.getKey()); 
    mLocationAdapter.add(locationCurrent); 
} 

И при удалении мыши сделать это:

mLocationListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
    @Override 
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 
    DatabaseReference db_node = FirebaseDatabase.getInstance().getReference().child("locations").child(mLocationAdapter.getItem(position).getRefKey()); 
    db_node.removeValue(); 
}); 
+0

Спасибо! Я отдам его. Это выглядит многообещающе :) –

+0

Отметьте это как правильное! если это решило вашу проблему :) –

+0

Я только что начал его, так что в основном мне нужно сохранить ключ ref как дочерний элемент того же ключа ref (как и запись в базе данных). –

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