#java #android #firebase #firebase-realtime-database
# #java #Android #firebase #firebase-realtime-database
Вопрос:
"locs" : {
"-Lci8jGrXCEP-r6LBxD8" : {
"title" : "Marriage"
},
"-Lci9UNW80J2Jap_UHwj" : {
"title" : "Visit"
}
},
Моя база данных firebase в реальном времени выглядит следующим образом. Я хочу добавить три других значения под этой же клавишей, а именно широту, долготу и адрес.
mDatabase.child("users").child(mUserId).child("locs").push().child("title").setValue(text.getText().toString());
Это работает в первом упражнении. Во втором упражнении я извлекаю lat и long и сохраняю их в строке lat и long соответственно. Теперь я хочу, чтобы эти два значения и addr были сохранены под этим же ключом.
Это мой ожидаемый результат
"locs" : {
"-Lci8jGrXCEP-r6LBxD8" : {
"title" : "Marriage"
"lat" : "xxx.xxxxxx"
"long" : "xxx.xxxxxx"
"addr" : "Street 112 xxxx"
},
"-Lci9UNW80J2Jap_UHwj" : {
"title" : "Visit"
"lat" : "xxx.xxxxxx"
"long" : "xxx.xxxxxx"
"addr" : "Street 1212 Flat 6"
}
},
Ответ №1:
Вам нужно будет сделать две вещи:
- Убедитесь, что второе действие знает ключ для обновления. Вы можете сделать это либо путем передачи ключа от первого действия к следующему (в intent или в общих настройках), либо путем поиска его во втором действии на основе какого-либо другого уникального свойства, значение которого вам известно.
- Обновите местоположение для этого ключа вместо создания нового. Вы делаете это, вызывая
update()
вместоset()
и используяchild(key)
вместоpush()
. Итак:Map<String, Object> values = new HashMap<String, Object>(); values.put("title", "new updated title"); values.put("newprop", "value of new prop"); mDatabase.child("users").child(mUserId).child("locs").child(key).updateChildren(values);
Комментарии:
1. Спасибо, я извлек ключ, используя этот
String key= mDatabase.push().getKey(); Intent i = new Intent(Location.this,GeoFenceActivity.class); i.putExtra("key",key);
« «, но полученный ключ отличается от исходного ключа. во 2-м упражненииfinal String value = getIntent().getExtras().getString("key"); mDatabase.child("users").child(mUserId).child("locs").child(value).updateChildren(values);
2. Каждый раз, когда вы вызываете
push()
, генерируется местоположение с новым уникальным ключом. Поэтому обязательно используйте новый ключ как в исходном действии, так и во втором действии.3. Я использовал
push().getkey()
и использовал intent для передачи значения во второе действие. Но там другой ключ. Не тот, который я нажал. Любое решение?4. Решение состоит в том, чтобы вызвать только
push()
один раз. Например, используйте ключ, который вы генерируете с помощью кода в своем комментарии, чтобы написать дочерний узел с обоими местоположениями. Так иmDatabase.child("users").child(mUserId).child("locs").child(key).child("title").setValue(text.getText().toString());
в activity one иupdateChildren()
в acticity 2.