Firebase kullanarak kullanıcıları ada özelliğine göre alın


129

Belirli kullanıcı hesaplarında veri alabileceğim / ayarlayabileceğim bir uygulama oluşturmaya çalışıyorum ve Firebase beni cezbetti.

Yaşadığım sorun, yapım şöyle göründüğünde belirli kullanıcı verilerini nasıl hedefleyeceğimi bilmemem:

Veri yapım aşağıdaki metinle açıklanmıştır.

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

Etrafıma baktım ve kimlikleri olarak rastgele bir hash verildiğinde, bireysel verilere nasıl erişileceğine dair hiçbir şey bulamıyorum.

Adlarına göre bireysel kullanıcı bilgilerini almaya nasıl başlayabilirim? Bunu yapmanın daha iyi bir yolu varsa lütfen bana söyleyin!


Yanıtlar:


156

Önceden Firebase, bazı alt özniteliklerle eşleşen öğeleri (örneğin, sahip tüm kullanıcılar ) bulmak ve almak için kendi dizinlerinizi oluşturmanızı veya bir konumdaki tüm verileri indirmenizi gerektiriyordu name === "Alex".

Ekim 2014'te Firebase, orderByChild()yöntem aracılığıyla bu tür sorguları hızlı ve verimli bir şekilde yapmanızı sağlayan yeni sorgulama işlevini kullanıma sundu . Aşağıdaki güncellenmiş yanıta bakın.


Firebase'e veri yazarken, farklı kullanım durumlarını yansıtan birkaç farklı seçeneğiniz vardır. Yüksek düzeyde Firebase, ağaç yapılı bir NoSQL veri deposudur ve veri listelerini yönetmek için birkaç basit ilke sağlar:

  1. Yazın benzersiz bilinen anahtarla Firebase için:

    ref.child('users').child('123').set({ "first_name": "rob", "age": 28 })
    
  2. Yazılan zamana göre otomatik olarak sıralayacak olan, otomatik olarak oluşturulmuş bir anahtara sahip listelere ekleyin :

    ref.child('users').push({ "first_name": "rob", "age": 28 })
    
  3. Verilerdeki değişiklikleri benzersiz, bilinen yoluna göre dinleyin :

    ref.child('users').child('123').on('value', function(snapshot) { ... })
    
  4. Bir listedeki verileri anahtara veya öznitelik değerine göre filtreleyin veya sıralayın :

    // 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', ...)
    

Eki ile, orderByChild()artık alt özniteliklerle ilgili sorgular için kendi dizininizi oluşturmanıza gerek yok! Örneğin, "Alex" adındaki tüm kullanıcıları almak için:

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

Firebase'deki Mühendis burada. Firebase'e veri yazarken, farklı uygulama kullanım durumlarını yansıtan birkaç farklı seçeneğiniz vardır. Firebase bir NoSQL veri deposu olduğundan, veri nesnelerinizi benzersiz anahtarlarla depolamanız gerekir, böylece bu öğeye doğrudan erişebilir veya tüm verileri belirli bir konumda yükleyebilir ve aradığınız düğümü bulmak için her öğe arasında döngü yapabilirsiniz. . Daha fazla bilgi için Veri Yazma ve Listeleri Yönetme konusuna bakın .

Firebase'de veri yazdığınızda, setverileri benzersiz, tanımlanmış bir yol (ör. a/b/c) Kullanarak veya pushbir listeye veri ekleyebilirsiniz ; bu, benzersiz bir kimlik (ör. a/b/<unique-id>) Oluşturur ve bu listedeki öğeleri zamana göre sıralamanıza ve sorgulamanıza olanak tanır. . Yukarıda gördüğünüz benzersiz kimlik, pushadresindeki listeye bir öğe eklemek için çağrı yapılarak oluşturulur online-b-cards/users.

pushBurada kullanmak yerine , sether kullanıcı için verileri, kullanıcının e-posta adresi gibi benzersiz bir anahtar kullanarak kullanmanızı ve depolamanızı tavsiye ederim . Ardından online-b-cards/users/<email>, Firebase JS SDK aracılığıyla adresine giderek kullanıcının verilerine doğrudan erişebilirsiniz. Örneğin:

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('hello@hello.com')) 
myUser.set({ email: 'hello@hello.com', name: 'Alex', phone: 12912912 });

Firebase referanslarda belirli karakterlere izin vermediğinden ( Referans Oluşturma konusuna bakın ), yukarıdaki kodda bulunan karakterleri kaldırıp bir .ile değiştirdiğimizi unutmayın ,.


1
@RobDiMarco Aşağıda Stephen tarafından gönderilen soruya bir cevabınız var mı?
Charles Han

2
Merhaba @RobDiMarco. Kimliğin temeli olarak e-posta adreslerini kullanma öneriniz hala geçerli olsa da, yanıtınızı yeni orderByChildözelliğe işaret edecek şekilde genişletmeniz faydalı olabilir . Bu cevabın sıklıkla alakalı / ilgili bir cevap olarak ortaya çıktığı göz önüne alındığında, insanlar buna bakmalı ve yeni sorgu özelliklerinin farkında olmalıdır.
Frank van Puffelen

1
@FrankvanPuffelen Harika fikir - not için teşekkürler. Bunu bugün güncelleyeceğim.
Rob DiMarco

1
@Ced Maalesef işlerin içindekiler hakkında yorum yapamam. Çok çalıştığımıza söz veriyorum (bu her zaman doğru olmuştur), ancak ayrıntı veremeyiz. Veritabanı API'si bazı yönlerden gerçekten kısıtlayıcıdır ve bunu kasıtlı olarak yalnızca belirli performans seviyelerini garanti edebileceğimiz yöntemleri ortaya çıkarmak için yapıyoruz. Bu nedenle, örneğin, bir işlemi tüm liste boyunca çalıştırmak için bir yöntem göstermiyoruz. İleri düzey kullanıcılar için belgelerde adil nokta. Şüpheniz olduğunda, ayrıntılı konuşmalar için Google Grubumuzu deneyin: groups.google.com/forum/#!forum/firebase-talk Ekip burada çok aktif!
Rob DiMarco

1
@RobDiMarco Bunu duymak harika. Dün Firebase işlevlerini gördüm ve tüm gün heyecanlandım çünkü Firebase'in oyunun kurallarını değiştirdiğini ve arka planda devrim yaratacağını düşündüm. Cidden, hayatında hiç kod yazmamış birine Firebase'de bir arka uç sürdürmeyi öğretebilirim. Bu oldukça şaşırtıcı ve oldukça korkutucu. Şerefe
Ced

5

Ayrıntıları aşağıdaki kod ile alabilirsiniz.

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()); 
                    }

4

Bence en iyi yaklaşım, Firebase tarafından sağlanan kimlik doğrulama nesnesine dayalı olarak kullanıcıların kimliklerini tanımlamaktır. Kullanıcılarımı oluşturduğumda şunları yapıyorum:

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

Bu kimlik şuradan geliyor:

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);
});

Firebase kimlik doğrulama hizmetleri, her zaman tüm sağlayıcıları arasında benzersiz bir kimliğin uid'de ayarlanmasını sağlar. Bu şekilde her zaman auth.uid'e sahip olursunuz ve güncellemek için istediğiniz kullanıcıya kolayca erişebilirsiniz, örneğin:

FirebaseRef.child('users').child(id).child('name').set('Jon Snow');

2

Bu, otomatik olarak oluşturulan benzersiz kimliğe erişmeye çalışırken bana yardımcı olan bir gönderinin başka kelimelerle ifade edilmesiydi. AngularFire örtük senkronizasyonu kullanarak ng-tekrar içinde Firebase benzersiz kimliklerine erişin

Teşekkürler bennlich (kaynak):

Firebase, normal bir javascript nesnesi gibi davranır. Belki aşağıdaki örnek sizi doğru yola götürebilir.

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

Düzenleme: İstediğiniz sonuçtan% 100 emin değilsiniz, ancak burada bir 'aha' anını tetikleyebilecek biraz daha fazlası var. Doğrudan Firebase kontrol panelinizden erişmeye çalıştığınız anahtarı tıklayın. Oradan aşağıdaki gibi bir şey kullanabilirsiniz:

var ref = new Firebase("https://online-b-cards.firebaseio.com/users/<userId>/name);
    ref.once('value', function(snapshot) {
        $scope.variable= snapshot.val();
});

Merhaba Anthony, REST yapısı (?) İle ilgili bilgiler için teşekkür ederim ve kesinlikle bir 'aha' yaptı. Bu gönderiye dönüp baktığımda, verilerimi biraz tuhaf bir şekilde yapılandırdığımı şimdi anlıyorum, ipuçları için teşekkürler ve bir sonraki firebase tabanlı projem için bunu aklımda tutacağım!
Richard Bamford

2

Firebase'de otomatik olarak oluşturulan benzersiz anahtarlara şu şekilde erişilir : veri yapısı : - 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);
});

1

En basit yol, .push(){}

bu rastgele anahtarı oluşturacak işlev. Ancak bunun .update(){}yerine, rastgele anahtar yerine çocuğun adını belirleyebileceğiniz işlevi kullanın .


1

Verilerin alınması:

Veritabanınızda, kullanılarak oluşturulan rastgele bir kimlik kullanıyorsunuz push(), bu nedenle verileri almak istiyorsanız aşağıdakileri yapın:

Firebase'i Android Uygulamasında kullanma:

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) {
          }
     });

Firebase'i Javascript'te kullanma:

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

Burada anlık görüntüye (verilerin konumu) sahip usersolursunuz , ardından tüm rastgele kimliklerin içinde döngü oluşturur ve adları alırsınız.


Belirli Bir Kullanıcı için Verilerin Alınması:

Şimdi, yalnızca belirli bir kullanıcı için bilgi almak istiyorsanız, bir sorgu eklemeniz gerekir:

Firebase'i Android Uygulamasında kullanma:

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

Firebase'i Javascript ile kullanma

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

Kullanmak orderByChild("name").equalTo("Alex"), where name="Alex"Alex ile ilgili verileri geri getirecek demek gibidir .


En iyi yol:

En iyisi, Firebase Authentication'ı kullanmak, böylece her kullanıcı için benzersiz bir kimlik oluşturmak ve bunu rastgele bir kimlik yerine kullanmaktır. push() , bu şekilde kimliğiniz olduğundan ve ona kolayca erişebileceğinizden tüm kullanıcılar arasında döngü yapmak zorunda kalmazsınız.

Öncelikle, kullanıcının oturum açması gerekir, ardından benzersiz kimliği alabilir ve bu kullanıcının diğer verilerini almak için bir dinleyici ekleyebilirsiniz:

Firebase'i Android ile kullanma:

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) {
      }
 });

Firebase'i Javascript ile kullanma:

    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;
   });
 

0

Kimliği doğrulanmış kullanıcıya göre veritabanınıza benzersiz kimlik eklemenin en basit ve daha iyi yolu şudur:

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);

UId, kimliği doğrulanmış belirli bir e-posta / kullanıcı için benzersiz bir kimlik olacaktır.


3
Bu soruyu ele almıyor. Soru, belirli kullanıcı hesaplarında verilerin nasıl alınacağı ve ayarlanacağıydı. Kodunuz bir kullanıcı hesabı oluşturur ve çünkü kutu değil .setValue (kullanıcı) olarak aslında geçerli değil kullanıcı geçerli bir parametre değildir.
Jay
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.