Вот пример использования стандартной (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
}
}
Во-первых, структура, которую вы используете для приложения, неверна.
возьмем пример пользователя 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
}
};
Счастливое кодирование:)