使用Firebase按名称获取用户

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

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

我的数据结构由下面的文字描述。

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

我环顾四周,我无法真正找到任何关于如何访问个人数据的信息,更不用说当他们将一些随机散列作为他们的ID时。

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


以前,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数据存储区,因此您需要使用唯一键存储数据对象,以便您可以直接访问该项目,或者在特定位置加载所有数据并遍历每个项目以查找您正在查找的节点对于。 请参阅编写数据和管理列表以获取更多信息。

    在Firebase中写入数据时,可以使用唯一的定义路径(即a/b/cset数据,也可以set数据push送到列表中,这将生成唯一的ID(即a/b/<unique-id> ),并允许您按时间对该列表中的项目进行排序和查询。 您在上面看到的唯一标识是通过调用push将一个项目追加到online-b-cards/users列表中生成的。

    我不推荐在这里使用push ,而是建议使用set ,并使用唯一键(例如用户的电子邮件地址)为每个用户存储数据。 然后,您可以通过Firebase JS SDK导航到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 });
    

    请注意,由于Firebase不允许在引用中使用某些字符(请参阅创建引用),我们将删除该引用. 并用替换它,在上面的代码。


    我认为最好的方法是根据Firebase提供的身份验证对象定义用户的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身份验证服务将始终确保其所有提供商中的唯一ID在uid中设置。 通过这种方式,您将拥有auth.uid,并可以轻松访问所需的用户来更新它,如:

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

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

    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()); 
                        }
    
    链接地址: http://www.djcxy.com/p/74039.html

    上一篇: Get users by name property using Firebase

    下一篇: do not reprint options + prompt