Изменение структуры газовой основы Geofire с ионным [дубликатом]

Вот пример использования стандартной (Java 1.6+) скриптовой библиотеки:

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class Test {

    public static void main(String[] args) throws Exception {
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine engine = factory.getEngineByName("JavaScript");

        engine.eval("value = 10");
        Boolean greaterThan5 = (Boolean) engine.eval("value > 5");
        Boolean lessThan5 = (Boolean) engine.eval("value < 5");

        System.out.println("10 > 5? " + greaterThan5); // true
        System.out.println("10 < 5? " + lessThan5); // false
    }
}
1
задан Kurai Bankusu 5 March 2017 в 13:20
поделиться

1 ответ

Во-первых, структура, которую вы используете для приложения, неверна.

возьмем пример пользователя app

Когда вы используете Geofire, у вас есть два списка данных:

a list of user details for each user
a list of latitude and longitude coordinates for each user

Вы пытаетесь сохранить как в такой же структуре, как это

"users" : {
    <userId> : {
        "userData" : "userData",
         <geofireData> 
        ...
    }
}

Пытаясь хранить данные пользователя и geofiredata в одном узле, это плохая идея, поскольку вы смешиваете в основном статические данные (свойства вашего пользователя) с сильно изменчивыми данными (информация о геопозиции). Разделение двух сторон приводит к повышению производительности, поэтому Geofire обеспечивает его.

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

Ваша структура базы данных должна быть такой.

"Users" : {
    <UserId> : {
        "UserData" : "UserData",
        ...
    }
}
"Users_location" : {
    <UserId> : {
        <geofireData> ...
    }
}

Следовательно, для того же идентификатора пользователя, который вы создаете 2 структурирует один для пользовательских данных, а другой - для геолокации данных этого пользователя.

Как нажимать пользователя и задавать геологические данные.

String userId = ref.child("users").push().getKey();

ref.child("users").child(userId).setValue(user);

geoFire = new GeoFire(ref.child("user_location"));
geoFire.setLocation(userId, new GeoLocation(lattitude, longitude));

пользователь, который вы используете в геолокации, так же, как тот, который вы получили во время push ().

Следовательно, для каждого пользователя вы имеете данные о деталях в одной структуре и сведениях о местоположении в структуре anotehr.

Чтобы получить данные, сначала вам нужно выполнить GeoQuery на узле users_location, а затем получить данные по методу onKeyEntered. Ключ параметра userId из моего примера.

geoFire=newGeoFire(FirebaseDatabase.getInstance().getReference().child("users_location");
geoQuery = geoFire.queryAtLocation(geoLocation), radius);
geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
    @Override
    public void onKeyEntered(String key, GeoLocation location) {
         //retrieve data
//use this key which is userId to fetch user details from user details structure
    }
};    

Счастливое кодирование:)

7
ответ дан Charan Reddy 15 August 2018 в 20:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: