IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Pavel Bařtipán:11.9.2018 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.9.2018 17:53
Avatar
Odpovídá na Pavel Bařtipán
Petr Štechmüller:11.9.2018 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.9.2018 18:49
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Pavel Bařtipán:11.9.2018 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.9.2018 18:54
Avatar
Odpovídá na Pavel Bařtipán
Petr Štechmüller:11.9.2018 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.9.2018 18:57
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Pavel Bařtipán
Petr Štechmüller:11.9.2018 18:59
DatabaseReference root; // představuje node "markers"

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

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

Editováno 11.9.2018 18:59
Nahoru Odpovědět
11.9.2018 18:59
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Pavel Bařtipán:11.9.2018 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.9.2018 18:59
Avatar
Odpovídá na Pavel Bařtipán
Petr Štechmüller:11.9.2018 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.9.2018 19:01
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Pavel Bařtipán:11.9.2018 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.9.2018 19:04
Avatar
Odpovídá na Pavel Bařtipán
Petr Štechmüller:11.9.2018 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.9.2018 19:18
Nahoru Odpovědět
11.9.2018 19:16
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Petr Štechmüller
Pavel Bařtipán:11.9.2018 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.9.2018 19:18
Avatar
Pavel Bařtipán:11.9.2018 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.9.2018 19:19
Avatar
Odpovídá na Pavel Bařtipán
Petr Štechmüller:11.9.2018 19:19

Už jsem to psal výš

markerRef.child(marker.getId()).removeValueAsync();
Nahoru Odpovědět
11.9.2018 19:19
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Petr Štechmüller:11.9.2018 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í
+2,50 Kč
Řešení problému
Nahoru Odpovědět
11.9.2018 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.