Diskuze: Firebase - Vymazání markeru z databáze

Java Java Firebase - Vymazání markeru z databáze American English version English version

Aktivity (1)
Avatar
Pallix
Člen
Avatar
Pallix:11. září 17:53

Zdravím, potřebuji poradit s aplikací, na které již nějakou chvilku pracuju. Jedná se o aplikaci, mapu, ve které můžu přidat marker s informacemi. Po přidání markeru do aplikace se následně nahraje do Firebase databáze (je to kvůli tomu, že chci, aby se markery zobrazily i poté, co aplikaci restartuji). To vše funguje, jen zatím nedokáži vyřešit problém s tím, jak marker z databáze smazat. Ze samotné aplikace jako takové to jde lehce, ale právě po restartu aplikace se marker objeví znova. Potřebuji tedy nějakým způsobem vymazat daný marker z databáze. Jde to vůbec nějakým způsobem? Budu rád za jakékoliv rady.

 
Odpovědět 11. září 17:53
Avatar
Odpovídá na Pallix
Petr Štechmüller:11. září 18:49

Ahoj, Firebase má API, pomocí kterého voláš jednotlivé CRUD operace. Pro smazání je tam metoda removeValueAsync, která se volá nad childem, který chceš smazat. Pokud budeš poradit něco konkrétního, hoď sem nějaký kód.

Nahoru Odpovědět 11. září 18:49
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Pallix
Člen
Avatar
Pallix:11. září 18:54

Mám to takhle. Na obrázku můžeš vidět, jak vypadá moje Firebase databáze. Řekněme, že potřebuji z mapy smazat například marker "-LKv6g80wqbMwj­YWRNky", ale chci, aby to vlastně poznalo samo, o jaký marker se jedná, tím, že na něj například kliknu a on se smaže.. Jak z aplikace tak z databáze.

 
Nahoru Odpovědět 11. září 18:54
Avatar
Odpovídá na Pallix
Petr Štechmüller:11. září 18:57

ale chci, aby to vlastně poznalo samo

Samo se nic nestane. V kódu musíš získat referenci na potomka s tímto id a nad touto instancí zavolat výše zmíněnou metodu removeValueAsync.

Nahoru Odpovědět 11. září 18:57
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Pallix
Petr Štechmüller:11. září 18:59
DatabaseReference root; // představuje node "markers"

root.child("-LKv6g80wqbMwjYWRNky").removeValueAsync();

Tento kus kódu budeš muset někam nacpat.

Editováno 11. září 18:59
Nahoru Odpovědět 11. září 18:59
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Pallix
Člen
Avatar
Pallix:11. září 18:59

Uznávám, že jsem to asi pospal drobet špatně.. Jde mi o to, že já id toho markeru (nebo čehokoliv jiného) neznám a ani nevím, jak toho právě docílit..

 
Nahoru Odpovědět 11. září 18:59
Avatar
Odpovídá na Pallix
Petr Štechmüller:11. září 19:01

Tak pokud sem nehodíš buď odkaz na celý projekt, nebo něco, čeho bych se mohl chytit, tak Ti tady asi těžko někdo poradí.

Nahoru Odpovědět 11. září 19:01
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Pallix
Člen
Avatar
Pallix:11. září 19:04

Uznávám, že to jsem mohl udělat už dřív. Předem upozorňuji, že kód je poměrně dlouhý.. :D
https://www.itnetwork.cz/…lighter/1098

 
Nahoru Odpovědět 11. září 19:04
Avatar
Odpovídá na Pallix
Petr Štechmüller:11. září 19:16
mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
 @Override
 public boolean onMarkerClick(Marker marker) {
  DatabaseReference markerRef = FirebaseDatabase.getInstance().getReference("markers");
  marker.getId();
  return true;
 }
});

Tady by jsi měl mít všechny informace ne?
Marker by měl být ten, na který jsi kliknul.

Editováno 11. září 19:18
Nahoru Odpovědět 11. září 19:16
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Pallix
Člen
Avatar
Odpovídá na Petr Štechmüller
Pallix:11. září 19:18

Ano, tam bych to měl mít, ale právě nevím, co tam do toho mám napsat, abych smazal ten daný marker z databáze a ne například všechny..

 
Nahoru Odpovědět 11. září 19:18
Avatar
Pallix
Člen
Avatar
Pallix:11. září 19:19

Takhle se mi smaže jen marker z aplikace, nikoliv z databáze.

mMap.setOnMar­kerClickListe­ner(new GoogleMap.OnMar­kerClickListe­ner() {
@Override
public boolean onMarkerClick(Mar­ker marker) {
DatabaseReference markerRef = FirebaseDataba­se.getInstance()­.getReference("mar­kers");
marker.remove();
return true;
}
});

 
Nahoru Odpovědět 11. září 19:19
Avatar
Odpovídá na Pallix
Petr Štechmüller:11. září 19:19

Už jsem to psal výš

markerRef.child(marker.getId()).removeValueAsync();
Nahoru Odpovědět 11. září 19:19
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Petr Štechmüller:11. září 20:44

Po dlouhé soukromé diskuzi jsme nalezli řešení:

1. bylo potřeba uložit si ID vygenerované z Firebase do tagu Markeru:

Marker marker = mMap.addMarker(mp);
marker.setTag(key);

2. při smazání markeru jsme vytáhli klíč z tagu a použili ho jako identifikátor childu, který jsme chtěli smazat:

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
 @Override
 public boolean onMarkerClick(Marker marker) {
  DatabaseReference markerRef = FirebaseDatabase.getInstance().getReference("markers");
  String key = ((String) marker.getTag());
  markerRef.child(key).removeValue();
  marker.remove();
  return true;
 }
});

3. Při načítání existujících markerů z Firebase bylo potřeba opět nastavit tag s klíčem z Firebase:

ValueEventListener eventListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                for(DataSnapshot ds : dataSnapshot.getChildren()) {
                  String key = ds.getKey();
                  Marker marker = mMap.addMarker(new MarkerOptions()
                            .position(new LatLng(latitude, longitude))
                            .title(titleInfo).snippet(infoInfo));
                  marker.setTag(key);
};
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 11. září 20:44
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.