android - studio - firebase database read write data



Aus der Methode ondatachange können keine Werte abgerufen werden (1)

Willkommen bei der asynchronen Programmierung, die alles durcheinander bringt, was Sie immer für wahr gehalten haben. :-)

Firebase ruft die Datenbank automatisch im Hintergrund ab bzw. synchronisiert sie mit ihr. Die Arbeit findet in einem separaten Thread statt, sodass Sie AsyncTask nicht benötigen. Dies bedeutet aber leider auch, dass Sie nicht auf die Daten warten können.

Normalerweise empfehle ich Ihnen, Ihren Code von "zuerst A, dann B" auf "wann immer wir A bekommen, machen wir B damit" umzugestalten.

In Ihrem Fall möchten Sie die Daten abrufen und dann den Längengrad des ersten Elements drucken. Das heißt, aktualisiert: Wenn Sie Daten empfangen, drucken Sie den Längengrad des ersten Elements.

Query query = ref.orderByChild("longitude");

query.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if(dataSnapshot.exists()){
            for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) {
                Location location =userSnapshot.getValue(Location.class);
                arrayList.add(location);
            }
            System.out.println("the first long is"+arrayList.get(0).getLongitude());                }
        else{
            System.out.println("not found");
        }
    }

    @Override
    public void onCancelled(FirebaseError firebaseError) {
          System.out.println("problem ");
    }
});

Ein paar Dinge, die Sie hier beachten sollten:

  1. Wenn Sie nur am ersten Element interessiert sind, können Sie die Abfrage auf ein Element beschränken: query = ref.orderByChild("longitude").limitToFirst(1) . Dadurch werden weniger Daten abgerufen.

  2. Ich empfehle die Verwendung von addValueEventListener() anstelle von addListenerForSingleValueEvent() . Ersteres synchronisiert die Daten weiter. Das heißt, wenn Sie den Längengrad eines Elements in die Liste einfügen / ändern, wird Ihr Code automatisch neu ausgelöst und das (möglicherweise) neue erste Element gedruckt.

Ich entwickle gerade eine Android-App, in der ich Firebase als Datenbank verwende, aber wenn ich die Variable in der onDataChange-Methode erhalte und sie einer globalen Variablen zuordne, erhalte ich Null-Variablen, aber wenn ich diese Variablen in der onDataChange-Methode aufrufe, sind sie nicht null.

public class PositionateMarkerTask extends AsyncTask {
    public ArrayList<Location> arrayList= new ArrayList<>();
    public void connect() {
        //setting connexion parameter
        final Firebase ref = new Firebase("https://test.firebaseio.com/test");
        Query query = ref.orderByChild("longitude");

        //get the data from the DB
        query.addListenerForSingleValueEvent(new ValueEventListener() {

            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                //checking if the user exist
                if(dataSnapshot.exists()){
                    for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) {
                        //get each user which has the target username
                        Location location =userSnapshot.getValue(Location.class);
                            arrayList.add(location);
                        //if the password is true , the data will be storaged in the sharedPreferences file and a Home activity will be launched
                    }
                }
                else{
                    System.out.println("not found");
                }
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {
                  System.out.println("problem ");

            }
        });
    }

    @Override
    protected Object doInBackground(Object[] params) {
        connect();
        return null;
    }

    @Override
    protected void onPostExecute(Object o) {
        super.onPostExecute(o);

        System.out.println("the firs long is"+arrayList.get(0).getLongitude());

    }
}




firebase-realtime-database