Uzyskaj użytkowników według nazwy za pomocą usługi Firebase

129

Próbuję stworzyć aplikację, w której mogę pobierać / ustawiać dane na kontach określonych użytkowników i kusiło mnie Firebase.

Problem polega na tym, że nie wiem, jak kierować reklamy na określone dane użytkowników, gdy moja struktura wygląda następująco:

Moja struktura danych opisana poniżej.

online-b-cards
  - users
    - InnROTBVv6FznK81k3m
       - email: "hello@hello"
       - main:  "Hello world this is a text"
       - name:  "Alex"
       - phone: 12912912

Rozejrzałem się i tak naprawdę nie mogę znaleźć niczego, jak uzyskać dostęp do poszczególnych danych, nie mówiąc już o tym, że otrzymują losowy hash jako identyfikator.

Jak mam się zabrać do pobierania informacji o poszczególnych użytkownikach na podstawie ich nazwisk? Jeśli istnieje lepszy sposób na zrobienie tego, powiedz mi!

Richard Bamford
źródło
spróbuj tego: stackoverflow.com/questions/32886546/…
ugali soft

Odpowiedzi:

156

Wcześniej Firebase wymagało wygenerowania własnych indeksów lub pobrania wszystkich danych z lokalizacji, aby znaleźć i pobrać elementy, które pasowały do ​​jakiegoś atrybutu podrzędnego (na przykład wszyscy użytkownicy z name === "Alex").

W październiku 2014 r. Firebase wprowadził nową funkcję zapytań za pomocą tej orderByChild()metody, która umożliwia szybkie i wydajne wykonywanie tego typu zapytań. Zobacz zaktualizowaną odpowiedź poniżej.


Podczas zapisywania danych do Firebase masz kilka różnych opcji, które będą odzwierciedlać różne przypadki użycia. Ogólnie rzecz biorąc, Firebase jest magazynem danych NoSQL o strukturze drzewa i zapewnia kilka prostych prymitywów do zarządzania listami danych:

  1. Napisz do Firebase za pomocą unikalnego, znanego klucza:

    ref.child('users').child('123').set({ "first_name": "rob", "age": 28 })
    
  2. Dołączaj do list za pomocą automatycznie generowanego klucza, który będzie automatycznie sortowany według czasu zapisania:

    ref.child('users').push({ "first_name": "rob", "age": 28 })
    
  3. Nasłuchuj zmian danych według ich unikalnej, znanej ścieżki:

    ref.child('users').child('123').on('value', function(snapshot) { ... })
    
  4. Filtruj lub porządkuj dane na liście według klucza lub wartości atrybutu :

    // Get the last 10 users, ordered by key
    ref.child('users').orderByKey().limitToLast(10).on('child_added', ...)
    
    // Get all users whose age is >= 25
    ref.child('users').orderByChild('age').startAt(25).on('child_added', ...)
    

Po dodaniu orderByChild()nie musisz już tworzyć własnego indeksu dla zapytań dotyczących atrybutów potomnych! Na przykład, aby pobrać wszystkich użytkowników o nazwie „Alex”:

ref.child('users').orderByChild('name').equalTo('Alex').on('child_added',  ...)

Inżynier w Firebase tutaj. Podczas zapisywania danych w Firebase masz kilka różnych opcji, które będą odzwierciedlać różne przypadki użycia aplikacji. Ponieważ Firebase jest magazynem danych NoSQL, będziesz musiał przechowywać obiekty danych z unikalnymi kluczami, aby mieć bezpośredni dostęp do tego elementu, lub załadować wszystkie dane w określonej lokalizacji i zapętlić każdy element, aby znaleźć węzeł, którego szukasz . Aby uzyskać więcej informacji, zobacz Zapisywanie danych i zarządzanie listami .

Podczas zapisywania danych w Firebase możesz albo setdane przy użyciu unikalnej, zdefiniowanej ścieżki (tj. a/b/c), Albo pushdane na liście, która wygeneruje unikalny identyfikator (tj. a/b/<unique-id>) I pozwoli na sortowanie i wysyłanie zapytań do elementów na tej liście według czasu . Unikalny identyfikator, który widzisz powyżej, jest generowany przez wywołanie pushdodania elementu do listy pod adresem online-b-cards/users.

Zamiast używać pushtutaj, zalecałbym używanie seti przechowywanie danych dla każdego użytkownika za pomocą unikalnego klucza, takiego jak adres e-mail użytkownika. Następnie możesz uzyskać bezpośredni dostęp do danych użytkownika, przechodząc do online-b-cards/users/<email>za pomocą pakietu SDK Firebase JS. Na przykład:

function escapeEmailAddress(email) {
  if (!email) return false

  // Replace '.' (not allowed in a Firebase key) with ',' (not allowed in an email address)
  email = email.toLowerCase();
  email = email.replace(/\./g, ',');
  return email;
}

var usersRef = new Firebase('https://online-b-cards.firebaseio.com/users');
var myUser = usersRef.child(escapeEmailAddress('[email protected]')) 
myUser.set({ email: '[email protected]', name: 'Alex', phone: 12912912 });

Zwróć uwagę, że ponieważ Firebase nie zezwala na określone znaki w odniesieniach (zobacz Tworzenie odwołań ), usuwamy znak .i zastępujemy go a ,w powyższym kodzie.

Rob DiMarco
źródło
2
@RobDiMarco Czy masz odpowiedź na pytanie zadane poniżej przez Stephena?
Charles Han
2
Hej @RobDiMarco. Chociaż Twoja sugestia użycia adresów e-mail jako podstawy identyfikatora jest nadal aktualna, warto rozszerzyć odpowiedź, aby wskazać nową orderByChildfunkcję. Biorąc pod uwagę, że ta odpowiedź pojawia się dość często jako odpowiednia / powiązana odpowiedź, ludzie są zobowiązani do jej obejrzenia i powinni być świadomi nowych funkcji zapytania.
Frank van Puffelen
1
@FrankvanPuffelen Świetny pomysł - dzięki za uwagę. Zaktualizuję to dzisiaj.
Rob DiMarco
1
@Ced Niestety, nie mogę komentować tego, co jest w przygotowaniu. Obiecuję, że ciężko pracujemy (to zawsze była prawda), ale nie mogę podać szczegółów. Interfejs API bazy danych rzeczywiście jest pod pewnymi względami restrykcyjny i robimy to celowo, aby ujawnić tylko metody, dla których możemy zagwarantować określony poziom wydajności. Dlatego na przykład nie ujawniamy metody do wykonywania operacji na całej liście. Uczciwa uwaga na temat dokumentów dla zaawansowanych użytkowników. W razie wątpliwości wypróbuj naszą Grupę Google, aby uzyskać szczegółowe rozmowy: groups.google.com/forum/#!forum/firebase-talk Zespół jest tutaj bardzo aktywny!
Rob DiMarco
1
@RobDiMarco Cudownie to słyszeć. Widziałem wczoraj funkcje Firebase i przez cały dzień byłem podekscytowany, ponieważ myślałem, że Firebase to zmieniacz gry i wkrótce zrewolucjonizuje zaplecze. Poważnie, mógłbym nauczyć kogoś, kto nigdy w życiu nie kodował, jak utrzymywać backend w Firebase. To dość niesamowite i dość przerażające. Pozdrawiam
Ced
5

Możesz pobrać szczegóły za pomocą następującego kodu.

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("users");
myRef.orderByChild("name").equalTo("Alex").addListenerForSingleValueEvent(new ValueEventListener() {           
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    for (DataSnapshot childDataSnapshot : dataSnapshot.getChildren()) {
                        Log.d(TAG, "PARENT: "+ childDataSnapshot.getKey());
                        Log.d(TAG,""+ childDataSnapshot.child("name").getValue()); 
                    }
Nabajyoti Das
źródło
4

Myślę, że najlepszym podejściem jest zdefiniowanie identyfikatorów użytkowników na podstawie obiektu uwierzytelniania dostarczonego przez Firebase. Tworząc użytkowników, robię:

FirebaseRef.child('users').child(id).set(userData);

Ten identyfikator pochodzi z:

var ref = new Firebase(FIREBASE);
var auth = $firebaseAuth(ref);
auth.$authWithOAuthPopup("facebook", {scope: permissions}).then(function(authData) {
    var userData = {}; //something that also comes from authData
    Auth.register(authData.uid, userData);
}, function(error) {
    alert(error);
});

Usługi uwierzytelniania Firebase zawsze zapewniają wszystkim swoim dostawcom unikalny identyfikator, który ma być ustawiony na uid. W ten sposób zawsze będziesz mieć auth.uid i możesz łatwo uzyskać dostęp do żądanego użytkownika, aby go zaktualizować, na przykład:

FirebaseRef.child('users').child(id).child('name').set('Jon Snow');
diegopso
źródło
2

To była parafraza posta, który pomógł mi przy próbie uzyskania dostępu do automatycznie generowanego unikalnego identyfikatora. Uzyskaj dostęp do unikalnych identyfikatorów Firebase w ramach ng-repeat dzięki niejawnej synchronizacji angularFire

Dzięki, bennlich (źródło):

Firebase zachowuje się jak normalny obiekt javascript. Być może poniższy przykład poprowadzi Cię na właściwą drogę.

<div ng-repeat="(name, user) in users">
    <a href="" ng-href="#/{{name}}">{{user.main}}</a>
</div>

Edycja: Nie jestem w 100% pewien pożądanego wyniku, ale tutaj jest trochę więcej, które może rozpalić moment „aha”. Kliknij klucz, do którego próbujesz uzyskać dostęp, bezpośrednio w panelu Firebase. Stamtąd możesz użyć czegoś takiego:

var ref = new Firebase("https://online-b-cards.firebaseio.com/users/<userId>/name);
    ref.once('value', function(snapshot) {
        $scope.variable= snapshot.val();
});
Anthony C.
źródło
Witaj Anthony, dziękuję za informacje dotyczące struktury REST (?) I na pewno zadziałało. Patrząc wstecz na ten post, teraz zrozumiałem, że ustrukturyzowałem moje dane w nieco niezręczny sposób, dzięki za wskazówki i będę o tym pamiętać przy następnym projekcie opartym na Firebase!
Richard Bamford,
2

Oto jak uzyskać dostęp do automatycznie generowanych unikalnych kluczy w Firebase: struktura danych : - OnlineBcards - UniqueKey

database.ref().on("value", function(snapshot) {
      // storing the snapshot.val() in a variable for convenience
      var sv = snapshot.val();
      console.log("sv " + sv); //returns [obj obj]

      // Getting an array of each key in the snapshot object
      var svArr = Object.keys(sv);
      console.log("svArr " + svArr); // [key1, key2, ..., keyn]
      // Console.log name of first key
      console.log(svArr[0].name);
}, function(errorObject) {
  console.log("Errors handled: " + errorObject.code);
});
Juan Reyes
źródło
1

Najprostszym sposobem jest zaprzestanie używania .push(){}

funkcja, która wygeneruje ten losowy klucz. Zamiast tego użyj .update(){}funkcji, w której możesz określić imię dziecka zamiast losowego klucza.

Miah Thompson
źródło
1

Pobieranie danych:

W swojej bazie danych korzystasz z losowego identyfikatora, który jest generowany za pomocą narzędzia push(), dlatego jeśli chcesz odzyskać dane, wykonaj następujące czynności:

Korzystanie z Firebase w aplikacji na Androida:

DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("users");
ref.addListenerForSingleValueEvent(new ValueEventListener() {           
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                for (DataSnapshot datas : dataSnapshot.getChildren()) {
                    String name=datas.child("name").getValue().toString();
                }
             }

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

Korzystanie z Firebase w JavaScript:

  firebase.database().ref().child("users").on('value', function (snapshot) {
   snapshot.forEach(function(childSnapshot) {
    var name=childSnapshot.val().name;
  });
});

Tutaj masz migawkę (lokalizację danych), usersa następnie pętlę wewnątrz wszystkich losowych identyfikatorów i odzyskujesz nazwy.


Pobieranie danych dla konkretnego użytkownika:

Teraz, jeśli chcesz pobrać informacje tylko dla określonego użytkownika, musisz dodać zapytanie:

Korzystanie z Firebase w aplikacji na Androida:

DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("users");
Query queries=ref.orderByChild("name").equalTo("Alex");
queries.addListenerForSingleValueEvent(new ValueEventListener() {...}

Korzystanie z Firebase z JavaScriptem

firebase.database().ref().child("users").orderByChild("name").equalTo("Alex").on('value', function (snapshot) {
   snapshot.forEach(function(childSnapshot) {
      var name=childSnapshot.val().name;
   });
});

Używanie orderByChild("name").equalTo("Alex")jest jak mówienie where name="Alex", że pobierze dane związane z Alexem.


Najlepszym sposobem:

Najlepszą rzeczą jest użycie uwierzytelniania Firebase, a tym samym wygenerowanie unikalnego identyfikatora dla każdego użytkownika i użycie go zamiast losowego identyfikatora push(), w ten sposób nie musisz przechodzić przez wszystkich użytkowników, ponieważ masz identyfikator i masz do niego łatwy dostęp.

Najpierw użytkownik musi być zalogowany, a następnie można pobrać unikalny identyfikator i dołączyć odbiornik, aby pobrać inne dane tego użytkownika:

Korzystanie z Firebase z Androidem:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference("users");
String uid = FirebaseAuthentication.getInstance().getCurrentUser().getUid();

ref.child(uid).addListenerForSingleValueEvent(new ValueEventListener() {
          @Override
         public void onDataChange(DataSnapshot dataSnapshot) { 
           String name=dataSnapshot.child("name").getValue().toString(); 
   }
         @Override
       public void onCancelled(DatabaseError databaseError) {
      }
 });

Korzystanie z Firebase z JavaScriptem:

    var user = firebase.auth().currentUser;
    var uid=user.uid;

    firebase.database().ref().child("users").child(uid).on('value', function (snapshot) {
     var name=snapshot.val().name;
   });
 
Peter Haddad
źródło
0

Najprostszym i lepszym sposobem dodania unikalnego identyfikatora do bazy danych ur według uwierzytelnionego użytkownika jest:

private FirebaseAuth auth;

String UId=auth.getCurrentUser().getUid();

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("Users");

User user = new User(name,email,phone,address,dob,bloodgroup);

myRef.child(UId).setValue(user);

Interfejs użytkownika będzie unikalnym identyfikatorem dla określonego uwierzytelnionego e-maila / użytkownika

M.Usman Younas
źródło
3
To nie odpowiada na pytanie. Pytanie dotyczyło sposobu pobierania i ustawiania danych na określonych kontach użytkowników. Twój kod tworzy konto użytkownika i w rzeczywistości jest nieprawidłowy, ponieważ nie może .setValue (użytkownik), ponieważ użytkownik nie jest prawidłowym parametrem.
Jay