Firebase का उपयोग करके नाम संपत्ति से उपयोगकर्ताओं को प्राप्त करें


129

मैं एक एप्लिकेशन बनाने की कोशिश कर रहा हूं, जहां मैं विशिष्ट उपयोगकर्ताओं के खातों में डेटा प्राप्त / सेट कर सकता हूं और मुझे Firebase द्वारा लुभाया गया था।

समस्या यह है कि मुझे पता नहीं है कि विशिष्ट उपयोगकर्ता डेटा को कैसे लक्षित किया जाए जब मेरी संरचना इस तरह दिखती है:

नीचे दिए गए पाठ द्वारा वर्णित मेरी डेटा संरचना।

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

मैंने चारों ओर देखा है और मैं वास्तव में कुछ भी नहीं पा सकता हूं कि व्यक्तिगत डेटा का उपयोग कैसे करें जब वे अपनी आईडी के रूप में कुछ यादृच्छिक हैश देते हैं।

मैं उनके नाम के आधार पर व्यक्तिगत उपयोगकर्ता जानकारी हथियाने के बारे में कैसे जाऊँगा? अगर ऐसा करने का कोई बेहतर तरीका है तो कृपया मुझे बताएं!


इसे आज़माएं: stackoverflow.com/questions/32886546/…
ugali soft

जवाबों:


156

इससे पहले, फायरबेस ने आपको अपने स्वयं के अनुक्रमित उत्पन्न करने या किसी बच्चे की विशेषता से मेल खाने वाले तत्वों को खोजने और पुनः प्राप्त करने के लिए एक स्थान पर सभी डेटा डाउनलोड करने की आवश्यकता थी (उदाहरण के लिए, सभी उपयोगकर्ताओं के साथ name === "Alex")।

अक्टूबर 2014 में, फायरबेस ने orderByChild()विधि के माध्यम से नई क्वेरी कार्यक्षमता को रोल आउट किया , जो आपको इस प्रकार के क्वेरी को जल्दी और कुशलता से करने में सक्षम बनाता है। नीचे दिए गए अद्यतन जवाब देखें।


फायरबेस में डेटा लिखते समय, आपके पास कुछ अलग विकल्प होते हैं जो विभिन्न उपयोग मामलों को दर्शाते हैं। उच्च स्तर पर, फायरबेस एक ट्री-संरचित NoSQL डेटा स्टोर है, और डेटा की सूचियों के प्रबंधन के लिए कुछ सरल प्राइमेटिव प्रदान करता है:

  1. एक अद्वितीय, ज्ञात कुंजी के साथ फायरबेस पर लिखें :

    ref.child('users').child('123').set({ "first_name": "rob", "age": 28 })
    
  2. स्वतः-जनित कुंजी के साथ सूचियों को संलग्न करें जो स्वचालित रूप से लिखे गए समय के अनुसार छाँटे जाएंगे:

    ref.child('users').push({ "first_name": "rob", "age": 28 })
    
  3. इसके अद्वितीय, ज्ञात पथ द्वारा डेटा में परिवर्तन के लिए सुनो :

    ref.child('users').child('123').on('value', function(snapshot) { ... })
    
  4. कुंजी या विशेषता मान द्वारा किसी सूची में डेटा फ़िल्टर या ऑर्डर करें :

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

के अतिरिक्त के साथ orderByChild(), आपको अब बाल विशेषताओं पर प्रश्नों के लिए अपना खुद का सूचकांक बनाने की आवश्यकता नहीं है! उदाहरण के लिए, "एलेक्स" नाम के साथ सभी उपयोगकर्ताओं को पुनः प्राप्त करने के लिए:

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

यहां फायरबेस में इंजीनियर। फायरबेस में डेटा लिखते समय, आपके पास कुछ अलग विकल्प होते हैं जो विभिन्न एप्लिकेशन उपयोग मामलों को दर्शाते हैं। चूंकि Firebase एक NoSQL डेटा स्टोर है, इसलिए आपको या तो अपने डेटा ऑब्जेक्ट्स को अनन्य कुंजियों के साथ संग्रहीत करने की आवश्यकता होगी, ताकि आप उस आइटम तक सीधे पहुंच सकें या किसी विशेष स्थान पर सभी डेटा लोड कर सकें और नोड के लिए आप ढूंढ रहे प्रत्येक आइटम के माध्यम से लूप पा सकें। । देखें लेखन डाटा और सूचियाँ प्रबंध अधिक जानकारी के लिए।

जब आप फायरबेस में डेटा लिखते हैं, तो आप या तो setएक अद्वितीय, परिभाषित पथ (यानी a/b/c), या pushडेटा का उपयोग करके एक सूची में डेटा कर सकते हैं, जो एक अद्वितीय आईडी (यानी a/b/<unique-id>) उत्पन्न करेगा और आपको उस सूची में आइटमों को समय पर सॉर्ट और क्वेरी करने की अनुमति देगा । वह अद्वितीय आईडी जो आप ऊपर देख रहे हैं push, सूची में किसी आइटम को जोड़ने के लिए कॉल करके उत्पन्न होती है online-b-cards/users

pushयहां उपयोग करने के बजाय , मैं उपयोग setकरने की सिफारिश करूंगा , और प्रत्येक उपयोगकर्ता के लिए एक अद्वितीय कुंजी का उपयोग करके डेटा संग्रहीत करना, जैसे उपयोगकर्ता का ईमेल पता। फिर आप online-b-cards/users/<email>फायरबेस जेएस एसडीके के माध्यम से नेविगेट करके सीधे उपयोगकर्ता के डेटा तक पहुंच सकते हैं । उदाहरण के लिए:

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

ध्यान दें कि चूँकि फ़ायरबेस संदर्भों में कुछ वर्णों को अनुमति नहीं देता (देखें संदर्भ बनाना ), हम .इसे हटा देते हैं और इसे ,ऊपर दिए गए कोड में बदल देते हैं।


1
@RobDiMarco क्या आपके पास स्टीफन द्वारा पोस्ट किए गए सवाल का जवाब है?
चार्ल्स हान

2
अरे @RobDiMarco। जबकि आईडी के लिए आधार के रूप में ईमेल-पते का उपयोग करने का आपका सुझाव अभी भी मान्य है, यह नई orderByChildसुविधा को इंगित करने के लिए आपके उत्तर का विस्तार करने के लायक हो सकता है । यह देखते हुए कि यह उत्तर प्रासंगिक / संबंधित उत्तर के रूप में अक्सर दिखाई देता है, लोग इसे देखने के लिए बाध्य हैं और नई क्वेरी सुविधाओं के बारे में पता होना चाहिए।
बजे फ्रैंक वैन पफेलन

1
@FrankvanPuffelen महान विचार - नोट के लिए धन्यवाद। मैं आज इसे अपडेट करूंगा।
रोब डिमार्को

1
@ दुर्भाग्य से, मैं क्या काम करता है पर टिप्पणी नहीं कर सकता। मैं वादा करता हूं कि हम काम में कठिन हैं (यह हमेशा सच रहा है), लेकिन हम विशेष नहीं दे सकते। डेटाबेस एपीआई वास्तव में कुछ मायनों में प्रतिबंधात्मक है, और हम इसे जानबूझकर केवल उन तरीकों को उजागर करने के लिए करते हैं जिनके लिए हम प्रदर्शन के कुछ स्तरों की गारंटी दे सकते हैं। यही कारण है कि हम उदाहरण के लिए, संपूर्ण सूची पर एक ऑपरेशन चलाने के लिए एक विधि को उजागर नहीं करते हैं। उन्नत उपयोगकर्ताओं के लिए डॉक्स पर उचित बिंदु। जब संदेह हो, तो विस्तृत बातचीत के लिए हमारे Google समूह का प्रयास करें: group.google.com/forum/#-forum/firebase-talk टीम यहां बहुत सक्रिय है!
रोब डिमार्को

1
@RobDiMarco यह सुनने में अद्भुत है। मैंने कल फायरबेस कार्यों को देखा, और पूरे दिन सम्मोहित रहा क्योंकि मुझे लगा कि फायरबेस एक गेम चेंजर है और बैक-एंड में क्रांति लाने वाला है। गंभीरता से, मैं किसी ऐसे व्यक्ति को सिखा सकता हूं जिसने फायरबेस पर बैकएंड बनाए रखने के लिए अपने जीवन में कभी भी कोड नहीं किया है। यह काफी आश्चर्यजनक है, और काफी डरावना है। चीयर्स
Ced

5

आप निम्नलिखित कोड द्वारा विवरण ले सकते हैं।

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

मुझे लगता है कि सबसे अच्छा तरीका फायरबेस द्वारा प्रदान की गई वस्तु वस्तु के आधार पर उपयोगकर्ताओं की आईडी को परिभाषित करना है। जब मैं अपने उपयोगकर्ता बनाता हूं, तो मैं यह करता हूं:

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

इस आईडी से आता है:

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

फायरबेस की सर्वव्यापी सेवाएं हमेशा अपने सभी प्रदाताओं के बीच यूआईडी पर एक अद्वितीय आईडी सुनिश्चित करेंगी। इस तरह से आपके पास हमेशा ऑर्ट.युड होगा और इसे अपडेट करने के लिए वांछित उपयोगकर्ता तक आसानी से पहुंच सकते हैं, जैसे:

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

2

यह एक पोस्ट का एक पैराफ्रेस्सिंग था जिसने मुझे ऑटो-जनरेट किए गए अद्वितीय आईडी तक पहुंचने की कोशिश करते समय मदद की। एनग्युलरफायर इम्प्लांट सिंक का उपयोग करके एनजी-रिपीट के भीतर फायरबैस यूनिक आईडी एक्सेस करें

धन्यवाद, बेनिलिच (स्रोत):

फायरबेस एक सामान्य जावास्क्रिप्ट वस्तु की तरह व्यवहार करता है। शायद नीचे दिए गए उदाहरण आपको सही रास्ते पर ला सकते हैं।

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

संपादित करें: अपने इच्छित परिणाम के बारे में 100% निश्चित नहीं है, लेकिन यहां थोड़ा और अधिक है जो एक 'अहा' पल को चिंगारी कर सकता है। उस कुंजी पर क्लिक करें जिसे आप अपने फायरबेस डैशबोर्ड में सही से एक्सेस करने का प्रयास कर रहे हैं। वहाँ से आप कुछ का उपयोग कर सकते हैं जैसे:

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

नमस्ते एंथोनी, REST संरचना (?) के संबंध में जानकारी के लिए धन्यवाद और इसने निश्चित रूप से एक 'अहा' को जगाया। इस पोस्ट को देखकर मुझे अब यह स्पष्ट हो गया है कि मैंने अपने डेटा को थोड़ा अजीब तरीके से संरचित किया था, सुझावों के लिए धन्यवाद और मैं इसे अपने अगले फायरबेस-आधारित प्रोजेक्ट के लिए ध्यान में रखूंगा!
रिचर्ड बेमफोर्ड 25

2

यह है कि Firebase में ऑटो जनरेटेड यूनीक कीज़ को कैसे एक्सेस करें: डेटा स्ट्रक्चर : - 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

इसका सबसे सरल तरीका है कि आप इसका इस्तेमाल बंद कर दें .push(){}

फ़ंक्शन जो कि यादृच्छिक कुंजी उत्पन्न करेगा। लेकिन इसके बजाय .update(){}फ़ंक्शन का उपयोग करें जहां आप यादृच्छिक कुंजी होने के बजाय बच्चे का नाम निर्दिष्ट कर सकते हैं।


1

डाटा लिया जा रहा है:

अपने डेटाबेस में, आप एक यादृच्छिक आईडी का उपयोग कर रहे हैं जो कि का उपयोग करके उत्पन्न होती है push(), इसलिए यदि आप डेटा को पुनः प्राप्त करना चाहते हैं तो निम्न कार्य करें:

एंड्रॉइड ऐप में फायरबेस का उपयोग करना:

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.database().ref().child("users").on('value', function (snapshot) {
   snapshot.forEach(function(childSnapshot) {
    var name=childSnapshot.val().name;
  });
});

यहां आपके पास स्नैपशॉट (डेटा का स्थान) है usersफिर आप सभी यादृच्छिक आईडी के अंदर लूप करते हैं और नामों को पुनः प्राप्त करते हैं।


विशिष्ट उपयोगकर्ता के लिए पुनर्प्राप्त डेटा:

अब यदि आप केवल एक विशिष्ट उपयोगकर्ता के लिए जानकारी प्राप्त करना चाहते हैं, तो आपको एक क्वेरी जोड़ने की आवश्यकता है:

एंड्रॉइड ऐप में फायरबेस का उपयोग करना:

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

जावास्क्रिप्ट के साथ Firebase का उपयोग करना

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

उपयोग करना orderByChild("name").equalTo("Alex")ऐसा कहने जैसा है कि where name="Alex"यह एलेक्स से संबंधित डेटा को पुनः प्राप्त करेगा।


सबसे अच्छा तरीका:

सबसे अच्छी बात यह है कि फायरबेस ऑथेंटिकेशन का उपयोग करें, इस प्रकार प्रत्येक उपयोगकर्ता के लिए एक अद्वितीय आईडी बनाते हैं और यादृच्छिक आईडी के बजाय इसका उपयोग करते हैं push(), इस तरह से आपको सभी उपयोगकर्ताओं के माध्यम से लूप नहीं करना पड़ता है क्योंकि आपके पास आईडी है और आसानी से इसे एक्सेस कर सकते हैं।

सबसे पहले, उपयोगकर्ता को साइन इन करने की आवश्यकता होती है, फिर आप अद्वितीय आईडी को पुनः प्राप्त कर सकते हैं और एक श्रोता को उस डेटा के अन्य डेटा को पुनः प्राप्त करने के लिए संलग्न कर सकते हैं:

Android के साथ Firebase का उपयोग करना:

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 का उपयोग करना:

    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

प्रमाणित उपयोगकर्ता के अनुसार यूआर डेटाबेस में अद्वितीय आईडी जोड़ने का सबसे सरल और बेहतर तरीका यह है:

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 एक विशिष्ट प्रमाणित ईमेल / उपयोगकर्ता के लिए एक विशिष्ट आईडी होगी


3
यह सवाल का समाधान नहीं है। सवाल यह था कि विशिष्ट उपयोगकर्ता खातों में डेटा कैसे प्राप्त करें और सेट करें। आपका कोड एक उपयोगकर्ता खाता बनाता है और वास्तव में आपके द्वारा .setValue (उपयोगकर्ता) के रूप में मान्य नहीं है क्योंकि उपयोगकर्ता एक मान्य पैरामीटर नहीं है।
Jay
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.