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

Ric*_*ord 126 firebase firebase-realtime-database

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

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

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

online-b-cards
  - users
    - InnROTBVv6FznK81k3m
       - email: "hello@hello"
       - main:  "Hello world this is a text"
       - name:  "Alex"
       - phone: 12912912
Run Code Online (Sandbox Code Playgroud)

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

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

Rob*_*rco 155

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

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


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

  1. 使用唯一的已知密钥写入 Firebase:

    ref.child('users').child('123').set({ "first_name": "rob", "age": 28 })
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用自动生成的密钥附加到列表,该密钥将按写入的时间自动排序:

    ref.child('users').push({ "first_name": "rob", "age": 28 })
    
    Run Code Online (Sandbox Code Playgroud)
  3. 通过其独特的已知路径监听数据的变化:

    ref.child('users').child('123').on('value', function(snapshot) { ... })
    
    Run Code Online (Sandbox Code Playgroud)
  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', ...)
    
    Run Code Online (Sandbox Code Playgroud)

通过添加orderByChild(),您不再需要为子属性的查询创建自己的索引!例如,要检索名为"Alex"的所有用户:

ref.child('users').orderByChild('name').equalTo('Alex').on('child_added',  ...)
Run Code Online (Sandbox Code Playgroud)

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

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

push我建议不要在这里使用set,而是使用唯一的密钥(例如用户的电子邮件地址)为每个用户存储数据.然后,您可以通过导航到online-b-cards/users/<email>Firebase JS SDK 直接访问用户的数据.例如:

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 });
Run Code Online (Sandbox Code Playgroud)

请注意,由于Firebase不允许引用中的某些字符(请参阅创建引用),因此我们删除.并将其替换,为上面的代码中的a .

  • 完善!谢谢Rob的回应.爱火基! (3认同)
  • @RobDiMarco 你对斯蒂芬在下面发布的问题有答案吗? (2认同)
  • 嘿@RobDiMarco.虽然您建议使用电子邮件地址作为ID的基础仍然有效,但可能值得扩展您的答案以指向新的`orderByChild`功能.鉴于此答案经常作为相关/相关答案出现,人们必然会看到它并且应该知道新的查询功能. (2认同)

Nab*_*Das 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()); 
                    }
Run Code Online (Sandbox Code Playgroud)