ফায়ারবেস ব্যবহার করে নামের সম্পত্তি অনুসারে ব্যবহারকারীদের পান


129

আমি একটি অ্যাপ্লিকেশন তৈরি করার চেষ্টা করছি যেখানে আমি নির্দিষ্ট ব্যবহারকারীদের অ্যাকাউন্টে ডেটা পেতে / সেট করতে পারি এবং ফায়ারবেস দ্বারা প্ররোচিত হয়েছিল।

আমার যে সমস্যাটি হচ্ছে তা হ'ল যখন আমার কাঠামোটি এমন দেখায় নির্দিষ্ট ব্যবহারকারীদের ডেটা কীভাবে লক্ষ্যবস্তু করতে হয় তা আমি জানি না:

নীচের পাঠ্য দ্বারা বর্ণিত আমার ডেটা কাঠামো।

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

আমি চারপাশে তাকিয়েছি এবং যখন তাদের আইডি হিসাবে কিছু এলোমেলো হ্যাশ দেওয়া হয় তখন ব্যক্তিগত ডেটা কীভাবে অ্যাক্সেস করা যায় সে সম্পর্কে সত্যই আমি কিছুই পাই না।

আমি কীভাবে তাদের নামের ভিত্তিতে পৃথক ব্যবহারকারীর তথ্য দখল করব? এটি করার আরও ভাল উপায় যদি থাকে তবে আমাকে বলুন!


উত্তর:


156

পূর্বে, ফায়ারবেস আপনাকে কিছু নিজস্ব বৈশিষ্ট্য (উদাহরণস্বরূপ, সমস্ত ব্যবহারকারী ) সহকারীর সাথে মেলে এমন উপাদানগুলি খুঁজে পেতে এবং পুনরুদ্ধার করার জন্য আপনার নিজস্ব সূচকগুলি তৈরি করতে বা কোনও স্থানে সমস্ত ডেটা ডাউনলোড করতে হবে name === "Alex"

অক্টোবর ২০১৪ এ, ফায়ারবেস orderByChild()পদ্ধতির মাধ্যমে নতুন অনুসন্ধানের কার্যকারিতা নিয়ে আসে , যা আপনাকে এই ধরণের ক্যোয়ারী দ্রুত এবং দক্ষতার সাথে সক্ষম করে। নীচে আপডেট উত্তর দেখুন।


ফায়ারবেসে ডেটা লেখার সময় আপনার কাছে কয়েকটি আলাদা বিকল্প রয়েছে যা বিভিন্ন ব্যবহারের ক্ষেত্রে প্রতিফলিত হবে। উচ্চ স্তরে, ফায়ারবেস একটি গাছ-কাঠামোগত নোএসকিউএল ডেটা স্টোর এবং ডেটার তালিকাগুলি পরিচালনা করার জন্য কয়েকটি সহজ আদিম সরবরাহ করে:

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

ফায়ারবেস এ ইঞ্জিনিয়ার। ফায়ারবেসে ডেটা লেখার সময়, আপনার কাছে কয়েকটি আলাদা বিকল্প রয়েছে যা বিভিন্ন অ্যাপ্লিকেশন ব্যবহারের ক্ষেত্রে প্রতিবিম্বিত করবে। ফায়ারবেস যেহেতু কোনও নুএসকিউএল ডেটা স্টোর, তাই আপনার প্রয়োজন হয় আপনার ডেটা অবজেক্টগুলিকে অনন্য কী সহ সংরক্ষণ করতে হবে যাতে আপনি সরাসরি সেই আইটেমটি অ্যাক্সেস করতে পারেন বা কোনও নির্দিষ্ট স্থানে সমস্ত ডেটা লোড করতে পারেন এবং নোডটি অনুসন্ধান করার জন্য প্রতিটি আইটেমের মধ্য দিয়ে লুপ করতে পারেন । দেখুন লিখন ডেটা এবং তালিকাসমূহ ম্যানেজিং আরও তথ্যের জন্য।

আপনি যখন ফায়ারবেসে ডেটা লেখেন, আপনি হয় 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
@ রবডিমারকো আপনার নীচে স্টিফেন পোস্ট করা প্রশ্নের উত্তর আছে?
চার্লস হান

2
আরে @ রবডিমার্কো। আইডির ভিত্তি হিসাবে ইমেল-ঠিকানা ব্যবহার করার জন্য আপনার পরামর্শটি বৈধ হলেও, নতুন orderByChildবৈশিষ্ট্যটির দিকে নির্দেশ করতে আপনার উত্তরটি প্রসারিত করার পক্ষে এটি উপযুক্ত হতে পারে । প্রদত্ত যে এই উত্তরটি প্রায়শই প্রাসঙ্গিক / সম্পর্কিত উত্তর হিসাবে প্রদর্শিত হয়, লোকেরা এটি দেখার জন্য আবদ্ধ এবং নতুন ক্যোয়ারী বৈশিষ্ট্য সম্পর্কে সচেতন হওয়া উচিত।
ফ্র্যাঙ্ক ভ্যান পাফেলেন

1
@ ফ্র্যাঙ্কভানপুফেলেন দুর্দান্ত ধারণা - এই নোটটির জন্য ধন্যবাদ। আমি আজ এটি আপডেট করব।
রব ডিমার্কো

1
@ সিড দুর্ভাগ্যক্রমে, আমি কী কাজ করছে সে সম্পর্কে মন্তব্য করতে পারি না। আমি প্রতিশ্রুতিবদ্ধ যে আমরা কঠোর পরিশ্রমী (এটি সর্বদা সত্য ছিল), তবে নির্দিষ্ট বিবরণ দিতে পারি না। ডেটাবেস এপিআই প্রকৃতপক্ষে কিছু উপায়ে প্রতিবন্ধক এবং আমরা কেবলমাত্র এমন পদ্ধতি উদ্ঘাটিত করার জন্য ইচ্ছাকৃতভাবে এটি করি যার জন্য আমরা নির্দিষ্ট স্তরের পারফরম্যান্সের গ্যারান্টি দিতে পারি। এই কারণেই আমরা একটি সম্পূর্ণ তালিকাতে কোনও অপারেশন চালানোর জন্য কোনও পদ্ধতি প্রকাশ করি না। উন্নত ব্যবহারকারীদের জন্য দস্তাবেজগুলিতে ফেয়ার পয়েন্ট। সন্দেহ হলে, বিস্তারিত কথোপকথনের জন্য আমাদের গুগল গ্রুপটি ব্যবহার করে দেখুন: গ্রুপ. google.com/forum/#!forum/firebase-talk এখানে টিমটি বেশ সক্রিয় রয়েছে!
রব ডিমার্কো

1
@ রবডিমারকো এটি শুনতে খুব সুন্দর। আমি গতকাল ফায়ারবেস ফাংশন দেখেছি এবং সারা দিন হাইপাই ছিলাম কারণ আমি ভেবেছিলাম ফায়ারবেস একটি গেম চেঞ্জার এবং ব্যাক-এন্ডে বিপ্লব ঘটাচ্ছে। সিরিয়াসলি, আমি এমন কাউকে শিখিয়ে দিতে পারি যিনি ফায়ারবেসে ব্যাকএন্ড বজায় রাখতে তার জীবনে কখনও কোড করেননি। এটি বেশ আশ্চর্যজনক এবং বেশ ভীতিজনক। চিয়ার্স
সিড 0

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

ফায়ারবেস লেখক পরিষেবা সর্বদা তাদের সমস্ত সরবরাহকারীদের মধ্যে ইউআইডি-তে সেট করার জন্য একটি অনন্য আইডি নিশ্চিত করবে। এইভাবে সর্বদা আপনার কাছে auth.uid থাকবে এবং পছন্দসই ব্যবহারকারীকে সহজেই এটি আপডেট করতে অ্যাক্সেস করতে পারে, যেমন:

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

হ্যালো অ্যান্টনি, আরইএসটি স্ট্রাকচার (?) নিয়ন্ত্রণের জন্য তথ্যের জন্য আপনাকে ধন্যবাদ এবং এটি অবশ্যই একটি 'আহা' করেছে। এই পোস্টটির দিকে ফিরে তাকালে এখন আমার কাছে স্পষ্ট হয়েছে যে আমি আমার তথ্যটি একটি বিশ্রী উপায়ে তৈরি করেছি, পরামর্শগুলির জন্য ধন্যবাদ এবং আমি এটি আমার পরবর্তী ফায়ারবেস ভিত্তিক প্রকল্পের জন্য মনে রাখব!
রিচার্ড বামফোর্ড

2

ফায়ারবেসে স্বয়ংক্রিয়ভাবে উত্পন্ন অনন্য কীগুলি কীভাবে অ্যাক্সেস করা যায় তা তথ্য উপাত্ত : - অনলাইনকারকার্ডস - ইউনিককি

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.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()করা, আপনার আইডি থাকার কারণে আপনাকে সমস্ত ব্যবহারকারীর মধ্য থেকে লুপ করতে হবে না এবং সহজেই এটি অ্যাক্সেস করতে পারে।

প্রথমে, ব্যবহারকারীকে সাইন ইন করতে হবে তারপরে আপনি অনন্য আইডিটি পুনরুদ্ধার করতে পারেন এবং সেই ব্যবহারকারীর অন্যান্য ডেটা পুনরুদ্ধার করতে শ্রোতার সাথে সংযুক্ত করতে পারেন:

অ্যান্ড্রয়েড সহ ফায়ারবেস ব্যবহার:

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

জাভাস্ক্রিপ্ট সহ ফায়ারবেস ব্যবহার:

    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 (ব্যবহারকারী) না পারায় প্রকৃতপক্ষে বৈধ নয় কারণ ব্যবহারকারী বৈধ প্যারামিটার নয়।
জয়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.