Я хочу добавить значения под тем же ключом

#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.