首页 文章

使用Firebase按名称属性获取用户

提问于
浏览
122

我正在尝试创建一个应用程序,我可以在特定用户帐户中获取/设置数据,我受到了Firebase的诱惑 .

我遇到的问题是,当我的结构如下所示时,我不知道如何定位特定用户数据:

My data structure described by the text below.

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

我环顾四周,当他们给出一些随机哈希作为他们的ID时,我真的找不到任何关于如何访问个人数据的信息 .

我如何根据他们的名字获取个人用户信息?如果有更好的方法,请告诉我!

8 回答

  • 2

    最简单的方法是停止使用 .push(){}

    将生成该随机密钥的函数 . 但是使用 .update(){} 函数,您可以在其中指定子项的名称,而不是使用随机键 .

  • 5

    我认为最好的方法是根据Firebase提供的auth对象定义用户的ID . 当我创建用户时,我会:

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

    这个id来自:

    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身份验证服务将始终确保在uid中设置所有提供程序中的唯一ID . 通过这种方式,您将拥有auth.uid并可以轻松访问所需的用户进行更新,例如:

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

    以前,Firebase要求您生成自己的索引或下载某个位置的所有数据,以查找和检索与某些子属性匹配的元素(例如,所有用户都使用 name === "Alex" ) .

    2014年10月,Firebase通过 orderByChild() 方法推出了新的查询功能,使您能够快速有效地执行此类查询 . 请参阅下面的更新答案 .


    将数据写入Firebase时,您可以使用一些不同的选项来反映不同的用例 . 在高层次上,Firebase是一个树状结构的NoSQL数据存储,并提供了一些简单的原语来管理数据列表:

    • 使用唯一的已知密钥写入Firebase:
    ref.child('users').child('123').set({ "first_name": "rob", "age": 28 })
    
    • 使用自动生成的密钥附加到列表,该密钥将按写入的时间自动排序:
    ref.child('users').push({ "first_name": "rob", "age": 28 })
    
    • 通过其唯一的已知路径监听数据的变化:
    ref.child('users').child('123').on('value', function(snapshot) { ... })
    
    • 按键或属性值过滤或排序列表中的数据:
    // 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() ,您不再需要为子属性的查询创建自己的索引!例如,要检索名为"Alex"的所有用户:

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

    这里是Firebase的工程师 . 将数据写入Firebase时,您可以使用一些不同的选项来反映不同的应用程序用例 . 由于Firebase是NoSQL数据存储,因此您需要使用唯一键存储数据对象,以便可以直接访问该项,或者在特定位置加载所有数据并遍历每个项以查找您正在查找的节点对于 . 有关详细信息,请参阅Writing DataManaging Lists .

    当您在Firebase中写入数据时,您可以使用唯一的,定义的路径(即 a/b/c )或 push 数据将数据放入列表中,这将生成唯一ID(即 a/b/<unique-id> )并允许您对项目进行排序和查询按时间列出 . 您在上面看到的唯一ID是通过调用 push 将项目附加到 online-b-cards/users 列表中生成的 .

    不是在这里使用 push ,我建议使用 set ,并使用唯一键存储每个用户的数据,例如通过Firebase JS SDK导航到 online-b-cards/users/<email> 的用户's email address. Then you can access the user'数据 . 例如:

    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不允许引用中的某些字符(请参阅Creating References),因此我们删除 . 并将其替换为上面代码中的 , .

  • 1

    检索数据:

    在您的数据库中,您使用的是使用 push() 生成的随机ID,因此,如果要检索数据,请执行以下操作:

    Using Firebase in Android App:

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

    Using Firebase in Javascript:

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

    在这里你有 users 的快照(数据的位置)然后你循环所有的随机id并检索名称 .


    检索特定用户的数据:

    现在,如果您只想检索特定用户的信息,则需要添加查询:

    Using Firebase in Android App:

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

    Using Firebase with Javascript

    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" 所以它将检索与Alex相关的数据 .


    最佳方式:

    最好的方法是使用Firebase身份验证,从而为每个用户生成一个唯一的ID并使用它而不是随机ID push() ,这样您就不必遍历所有用户,因为您拥有该ID并且可以轻松访问它 .

    首先,用户需要登录,然后您可以检索唯一ID并附加侦听器以检索该用户的其他数据:

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

    Using Firebase with 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;
       });
    
  • 2

    这是在Firebase中访问自动生成的唯一键的方法: data structure : - 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);
    });
    
  • 0

    这是一个帖子的解释,它帮助我尝试访问自动生成的唯一ID . Access Firebase unique ids within ng-repeat using angularFire implicit sync

    谢谢,bennlich(来源):

    火力地堡表现得像一个普通的javascript对象 . 也许以下示例可以让您走上正轨 .

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

    编辑:不是100%肯定你想要的结果,但这里可能会引发'aha'时刻 . 在Firebase信息中心中单击您尝试访问的密钥 . 从那里你可以使用类似的东西:

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

    根据经过身份验证的用户向您的数据库添加唯一ID的最简单和更好的方法是:

    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将是特定经过身份验证的电子邮件/用户的唯一ID

  • 1

    您可以通过以下代码获取详细信息 .

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

相关问题