[Android] Datenbankabfrage liefert falsche Ergebnisse

Gismodin

Cadet 3rd Year
Registriert
Mai 2013
Beiträge
32
Hallo,

in meinem Übungsprogramm wird eine Datenbank genutzt, in der 3 Objekte der Klasse EventModel abgespeichert sind.
Diese haben die Werte string title, location, date, description und key.

Die 3 Objekte:

EventModel event1 = new EventModel("Fasching in der Bürgerhalle", "Frankfurt", "11.11.17", "Faschingsfeier", null);
EventModel event2 = new EventModel("Karneval in Köln", "Köln", "11.11.17", "Die größte Faschingsparty Deutschlands", null);
EventModel event3 = new EventModel("Augsburger Weihnachtsmarkt", "Augsburg", "12.12. - 24.12.17", "Weihnachtsmarkt vor dem Rathaus", null);


Nun soll der Benutzer gezielt nach einem Ort suchen, den er über ein editText eingibt. Beim Buttonclick soll dann in der Datenbank geschaut werden, welche Events in dieser Stadt stattfinden und ausgeben

Der Code für die Suchabfrage:

Code:
    public void query(String search){
        database = FirebaseDatabase.getInstance();
        DatabaseReference ref = database.getReference("events");

        Query searchCity = ref.orderByChild("location").startAt(search);

        searchCity.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for(DataSnapshot data : dataSnapshot.getChildren()){
                    EventModel m = data.getValue(EventModel.class);
                    String s ="Event: " + m.getTitle() + "\n   Wann: " + m.getDate() + "\n";
                    txtShow.append(s);
                    Log.i("Daten: ", m.getTitle() + " " + m.getDate());

                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });


    }

    public void btnSearchClicked(View view){
        String search = String.valueOf(editSearch.getText());
        txtShow.setText("");
        query(search);
    }

Das Problem ist nun aber in dieser Zeile
Query searchCity = ref.orderByChild("location").startAt(search);
Wenn ich nun eine Suche durhcführe bekomme ich jedoch falsche Rückgaben. Bei "Frankfurt" erhalte ich sowohl das Event1 als auch 2. Bei "Köln" richtigerweise nur Event2 und bei "Augsburg" alle 3.
Mit equalTo() stimmen die Rückgaben bei allen 3 Begriffen.

Kann sich jemand vorstellen, an was das liegt?

Gruß
Gismodin
 
Meine Vermutung:

Du sortierst nach der Spalte "Location". Also hast du die Reihenfolge 3, 1, 2. A, F, K.

Nun sagst du mit "startAt", wo er anfangen soll, nicht aber, welchen Wert du willst. Also gibt er alle Werte zurück, die in der neuen Reihenfolge dahinter stehen.
 
Ich glaube Dir ist nicht klar, was deine Query tut, bzw was die einzelnen Teile genau definieren.
Zum einen sortierst du nach dem Parameter von orderByChild (-> location). Sprich die order aller Resultate deiner Query ist event3, event1, event2.
Zum anderen rufst du startAt statt equalTo auf. Hiermit definierst du, dass du alle Resultate ab dem übergebenen Parameter suchst (inklusiv).
Deshalb erhälst du bei dieser Query auch nur bei "Köln" dieses als einziges Resultat. startAt gibt Dir also eine Liste als Ergebnis ab dem definierten Startpunkt.

Mir ist nicht ganz klar was du jetzt eigentlich suchst? Du hast ja schon selber herausgefunden, dass equalTo Dir genau das jeweilige richtige Resultat liefert?
Dir ist klar, dass du bei equalTo kein orderByChild brauchst?
 
Ah, verstehe.
Also StartAt gibt nur einen Startpunkt der Wiedergabe an, in dem Tutorial, was ich dazu ansah, wurde es so beschrieben, dass es bswp. mit der Eingabe "Fran" umgehen kann und alle Objekte für Frankfurt ausgibt. Equals würde da ja dann nichts ausgeben. Somit erübrigt sich natürlich meine Frage, an was die Ausgabe lag.

Die richtige Anfrage wäre dann:
Query searchCity = ref.equalsTo(search); ?

Danke für eure Antworten
 
Zurück
Oben