2016-12-28 4 views
1

Я пытаюсь получить идентификатор конкретного ребенка в базе данных Firebase. База данных выглядит следующим образом:getKey() возвращает значение вместо ID

Users: 

- id: user1 
- id: user2 
- ... 

Теперь я хочу, чтобы вернуть ID каждого пользователя, и я попробовал с этим;

DatabaseReference databaseRef = FirebaseDatabase.getInstance().getReference(); 
     ValueEventListener users = databaseRef.child("Users").child(bundle.getString("User")).addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 

       String userID = dataSnapshot.getKey(); 


       mTextView.setText(userID); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       //error 
      } 
     }); 

bundle.getString("User") является строка, которая содержит значение которого пользователь Я хочу, чтобы получить ID от.

Когда я открываю приложение, текст в mTextView просто содержит имя пользователя вместо идентификатора.

Что я здесь сделал неправильно?

Приложение представляет собой ListView в основном мероприятии, содержащем всех пользователей. Когда пользователь нажимает на элемент списка, открывается новое действие. В этом упражнении я хочу показать информацию о выбранном пользователе, но для этого я хочу, чтобы получить идентификатор, чтобы найти соответствующую информацию в базе данных с тем же ID ..

JSON:

{ 
    "Users" : [ null, "Jef", "Peter", "Jean", "Ronny" ] 
} 
+1

Попробуйте записать этот 'dataSnapshot.getRef(). ToString()' и опубликовать результат.На основе вашей структуры базы данных 'bundle.getString (« Пользователь »)' должна быть частью 'id', правильно? Кроме того, пожалуйста, экспортируйте базу данных как JSON, а затем опубликуйте ее здесь. – Wilik

+0

@Wilik dataSnapshot.getRef(). ToString() возвращает ссылку на дочерний элемент в базе данных, и никакой пакет bundle.getString («Пользователь») не содержит значения, например, «user1», из которого я хочу ID .. –

+0

Nothing неверно в вашем коде. Но, разместив структуру базы данных как JSON, мы можем найти, в чем проблема, вы можете удалить любую конфиденциальную информацию. Кстати, у вас есть ID уже в 'bundle.getString (« Пользователь »), почему вы пытаетесь получить одну и ту же строку, вызвав' dataSnapshot.getKey() '? Если вы хотите получить значение, вы должны вместо этого называть 'dataSnapshot.getValue()' – Wilik

ответ

2

Рекомендуется для ознакомления с этой статьей Best Practices: Arrays in Firebase

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

Это означает, что вы не можете получить каждый индекс массива под Users. Сначала вы можете получить весь массив (databaseRef.child("Users").addValueEventListener()), отбросить возвращенный dataSnapshot в массив, а затем проверить значение вручную или использовать метод contains.

То, что я предлагаю, чтобы изменить структуру базы данных, чтобы нравится этот

{ 
    "Users" : { 
     "Jef" : true, 
     "Peter" : true, 
     "Jean" : true, 
     "Ronny" : true 
    } 
} 

С помощью этой структуры базы данных, вам не нужно, чтобы изменить код, потому что он должен работать уже.

EDIT: В вашем случае, вы можете сохранить другие пользовательские данные в другом узле базы данных

{ 
    "Users" : { 
     "Jef" : true, 
     "Peter" : true, 
     "Jean" : true, 
     "Ronny" : true 
    }, 
    "Users_details" : { 
     "Jef" : { 
      "city" : "some_city_name", 
      "address" : "some_address_name", 
      "phone_number" : "some_phone_number" 
     }, 
     "Peter" : { 
      "city" : "some_city_name", 
      "address" : "some_address_name", 
      "phone_number" : "some_phone_number" 
     }, 
     "Jean" : { 
      ... 
     }, 
     ... 
    } 
} 
  • Чтобы получить список имен пользователей, вам просто нужно слушать Users узел
  • Затем, когда вид в ListView щелкают, отправить имя пользователя, как пристальный дополнительные к другой деятельности intent.putExtra("username", username);
  • Наконец, в новой деятельности, слушать Users_details/<username_from_intent>, чтобы получить информацию о пользователе (номер телефона, адрес и т. Д.)

Надеюсь, что эта помощь определенно лучше, чем сохранение каждой детали в массиве. Если вы прочитали первую ссылку, которую я предоставил, эту практику следует избегать, так как вы можете изменить данные пользователя.

+0

Но цель моего приложения - получить связанную информацию из базы данных Firebase. Все эти данные будут храниться в разных массивах (пользователи, адреса, номера телефонов и т. Д.), А связанные с ними данные получат одинаковый идентификатор. Как я могу сделать это с помощью этой структуры? –

+0

Я отредактировал свою базу данных, но теперь, конечно, ListView со всеми моими пользователями не работает, потому что все они Booleans. Итак, теперь мне нужно получить идентификаторы в моем ListView? –

+0

Вы не должны хранить свои данные, как в базе данных Firebase/NoSQL. Я предлагаю вам посмотреть этот плейлист [Firebase для разработчиков SQL] (https://www.youtube.com/watch?v=WacqhiI-g_o&list=PLl-K7zZEsYLlP-k-RKFa7RyNPa9_wCH2s) и прочитать [Структура вашей базы данных] (https: //firebase.google.com/docs/database/android/structure-data) Если вы не хотите изменять структуру базы данных, прочитайте мой обновленный ответ @MaartenWeyns – Wilik

Смежные вопросы