Dapatkan pengguna dengan properti nama menggunakan Firebase

129

Saya mencoba membuat aplikasi tempat saya bisa mendapatkan / mengatur data di akun pengguna tertentu dan saya tergoda oleh Firebase.

Masalah yang saya alami adalah bahwa saya tidak tahu bagaimana menargetkan data pengguna tertentu ketika struktur saya terlihat seperti ini:

Struktur data saya dijelaskan oleh teks di bawah ini.

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

Saya telah melihat sekeliling dan saya benar-benar tidak dapat menemukan apa pun tentang cara mengakses data individu apalagi ketika mereka diberi beberapa hash acak sebagai ID mereka.

Bagaimana cara saya mengambil informasi pengguna berdasarkan nama mereka? Jika ada cara yang lebih baik untuk melakukannya, tolong beri tahu saya!

Richard Bamford
sumber

Jawaban:

156

Sebelumnya, Firebase mengharuskan Anda untuk membuat indeks Anda sendiri atau mengunduh semua data di lokasi untuk menemukan dan mengambil elemen yang cocok dengan beberapa atribut anak (misalnya, semua pengguna dengan name === "Alex").

Pada Oktober 2014, Firebase meluncurkan fungsionalitas kueri baru melalui orderByChild()metode, yang memungkinkan Anda untuk melakukan jenis kueri ini dengan cepat dan efisien. Lihat jawaban yang diperbarui di bawah ini.


Saat menulis data ke Firebase, Anda memiliki beberapa opsi berbeda yang akan mencerminkan berbagai kasus penggunaan. Pada tingkat tinggi, Firebase adalah penyimpanan data NoSQL yang terstruktur pohon, dan menyediakan beberapa primitif sederhana untuk mengelola daftar data:

  1. Tulis ke Firebase dengan kunci unik dan dikenal:

    ref.child('users').child('123').set({ "first_name": "rob", "age": 28 })
    
  2. Tambahkan ke daftar dengan kunci yang dibuat secara otomatis yang akan secara otomatis mengurutkan berdasarkan waktu yang ditulis:

    ref.child('users').push({ "first_name": "rob", "age": 28 })
    
  3. Dengarkan perubahan data dengan jalurnya yang unik dan dikenal:

    ref.child('users').child('123').on('value', function(snapshot) { ... })
    
  4. Memfilter atau memesan data dalam daftar dengan kunci atau nilai atribut :

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

Dengan tambahan orderByChild(), Anda tidak perlu lagi membuat indeks sendiri untuk pertanyaan tentang atribut anak! Misalnya, untuk mengambil semua pengguna dengan nama "Alex":

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

Engineer di Firebase di sini. Saat menulis data ke Firebase, Anda memiliki beberapa opsi berbeda yang akan mencerminkan berbagai kasus penggunaan aplikasi. Karena Firebase adalah penyimpanan data NoSQL, Anda harus menyimpan objek data dengan kunci unik sehingga Anda dapat langsung mengakses item itu atau memuat semua data di lokasi tertentu dan mengulangi setiap item untuk menemukan simpul yang Anda cari . Lihat Menulis Data dan Mengelola Daftar untuk informasi lebih lanjut.

Saat Anda menulis data di Firebase, Anda bisa setmenggunakan data jalur unik yang ditentukan (yaitu a/b/c), atau pushdata ke dalam daftar, yang akan menghasilkan id unik (yaitu a/b/<unique-id>) dan memungkinkan Anda untuk mengurutkan dan menanyakan item dalam daftar itu berdasarkan waktu. . ID unik yang Anda lihat di atas dihasilkan dengan menelepon pushuntuk menambahkan item ke daftar di online-b-cards/users.

Daripada menggunakan di pushsini, saya akan merekomendasikan menggunakan set, dan menyimpan data untuk setiap pengguna menggunakan kunci unik, seperti alamat email pengguna. Kemudian Anda dapat mengakses data pengguna secara langsung dengan menavigasi online-b-cards/users/<email>melalui Firebase JS SDK. Sebagai contoh:

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

Perhatikan bahwa karena Firebase tidak mengizinkan karakter tertentu dalam referensi (lihat Membuat Referensi ), kami menghapus .dan menggantinya dengan ,dalam kode di atas.

Rob DiMarco
sumber
1
@RobDiMarco Apakah Anda punya jawaban untuk pertanyaan yang diposting di bawah ini oleh Stephen?
Charles Han
2
Hai @RobDiMarco. Meskipun saran Anda untuk menggunakan alamat email sebagai dasar untuk id masih valid, mungkin perlu memperluas jawaban Anda untuk menunjuk ke orderByChildfitur baru . Mengingat bahwa jawaban ini muncul cukup sering sebagai jawaban yang relevan / terkait, orang terikat untuk melihatnya dan harus mengetahui fitur permintaan baru.
Frank van Puffelen
1
@ FrankrankPuffelen Ide bagus - terima kasih atas catatannya. Saya akan memperbarui ini hari ini.
Rob DiMarco
1
@ Ced Sayangnya, saya tidak bisa mengomentari apa yang ada dalam karya. Saya berjanji bahwa kita bekerja keras (itu selalu benar), tetapi tidak dapat memberikan secara spesifik. API Database memang membatasi dalam beberapa hal, dan kami melakukan ini dengan sengaja untuk hanya mengekspos metode yang kami dapat menjamin tingkat kinerja tertentu. Inilah sebabnya kami tidak memaparkan metode untuk menjalankan operasi di seluruh daftar, misalnya. Poin wajar pada dokumen untuk pengguna tingkat lanjut. Jika ragu, coba Grup Google kami untuk percakapan terperinci: groups.google.com/forum/#!forum/firebase-talk Tim ini sangat aktif di sini!
Rob DiMarco
1
@RobDiMarco Senang sekali mendengarnya. Saya melihat fungsi Firebase kemarin, dan dihipnotis sepanjang hari karena saya pikir Firebase adalah pengubah permainan dan akan merevolusi back-end. Serius, saya bisa mengajar seseorang yang tidak pernah berkode dalam hidupnya untuk mempertahankan backend di Firebase. Itu luar biasa, dan sangat menakutkan. Bersulang
Ced
5

Anda dapat mengambil detailnya dengan kode berikut.

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
sumber
4

Saya pikir pendekatan terbaik adalah mendefinisikan id dari pengguna berdasarkan objek auth yang disediakan oleh Firebase. Ketika saya membuat pengguna saya, saya lakukan:

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

ID ini berasal dari:

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

Layanan autentikasi Firebase akan selalu memastikan id unik di antara semua penyedia mereka yang akan ditetapkan pada uid. Dengan cara ini selalu Anda akan memiliki auth.uid dan dapat dengan mudah mengakses pengguna yang diinginkan untuk memperbaruinya, seperti:

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

Ini adalah parafrase dari postingan yang membantu saya ketika mencoba mengakses id unik yang dibuat secara otomatis. Akses Firebase id unik dalam ng-repeat menggunakan sinkronisasi implisit angularFire

Terima kasih, bennlich (sumber):

Firebase berperilaku seperti objek javascript biasa. Mungkin contoh di bawah ini dapat membuat Anda di jalur yang benar.

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

Sunting: Tidak 100% yakin dengan hasil yang Anda inginkan, tetapi ada sedikit lebih banyak yang mungkin memicu momen 'aha'. Klik tombol yang Anda coba akses langsung di dasbor Firebase Anda. Dari sana Anda dapat menggunakan sesuatu seperti:

var ref = new Firebase("https://online-b-cards.firebaseio.com/users/<userId>/name);
    ref.once('value', function(snapshot) {
        $scope.variable= snapshot.val();
});
AnthonyC
sumber
Halo Anthony, terima kasih atas informasi yang mengatur struktur REST (?) Dan itu benar-benar mencurangi 'aha'. Melihat kembali pada posting ini, jelas bagi saya sekarang bahwa saya telah menyusun data saya dengan sedikit canggung, terima kasih atas tipnya dan saya akan mengingatnya untuk proyek berbasis firebase berikutnya!
Richard Bamford
2

Ini adalah cara mengakses kunci unik yang dibuat secara otomatis di Firebase: struktur data : - Kartu Online - 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
sumber
1

Cara paling sederhana adalah berhenti menggunakan .push(){}

fungsi yang akan menghasilkan kunci acak itu. Tetapi alih-alih gunakan .update(){}fungsi tempat Anda dapat menentukan nama anak alih-alih memiliki kunci acak.

Miah Thompson
sumber
1

Mengambil data:

Di database Anda, Anda menggunakan id acak yang dihasilkan menggunakan push(), oleh karena itu jika Anda ingin mengambil data kemudian lakukan hal berikut:

Menggunakan Firebase di Aplikasi Android:

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

Menggunakan Firebase di Javascript:

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

Di sini Anda memiliki snapshot (lokasi data) userssaat Anda mengulang di dalam semua id acak dan mengambil nama.


Mengambil data untuk Pengguna Tertentu:

Sekarang jika Anda ingin mengambil informasi hanya untuk pengguna tertentu, maka Anda perlu menambahkan kueri:

Menggunakan Firebase di Aplikasi Android:

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

Menggunakan Firebase dengan Javascript

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

Menggunakan orderByChild("name").equalTo("Alex")seperti mengatakan where name="Alex"sehingga akan mengambil data yang terkait dengan Alex.


Cara terbaik:

Yang terbaik adalah menggunakan Firebase Authentication, sehingga menghasilkan id unik untuk setiap pengguna dan menggunakannya sebagai ganti dari id acak push(), dengan cara ini Anda tidak perlu mengulangi semua pengguna karena Anda memiliki id dan dapat dengan mudah mengaksesnya.

Pertama, pengguna harus masuk lalu Anda dapat mengambil id unik dan melampirkan pendengar untuk mengambil data lain dari pengguna itu:

Menggunakan Firebase dengan Android:

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

Menggunakan Firebase dengan Javascript:

    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
sumber
0

Cara paling sederhana dan lebih baik untuk menambahkan Id unik ke basis data Anda menurut pengguna terotentikasi adalah:

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 akan menjadi Id unik untuk email / pengguna terotentikasi tertentu

M. Usman Younas
sumber
3
Itu tidak menjawab pertanyaan. Pertanyaannya adalah bagaimana cara mendapatkan dan mengatur data di akun pengguna tertentu. Kode Anda membuat akun pengguna dan sebenarnya tidak valid karena Anda tidak dapat .setValue (pengguna) karena pengguna bukan parameter yang valid.
Jay