132

我正在尝试创建一个应用程序,我可以在其中获取/设置特定用户帐户中的数据,我被 Firebase 所吸引。

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

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

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

我环顾四周,我真的找不到任何关于如何访问个人数据的信息,更不用说当他们被赋予一些随机哈希作为他们的 ID 时。

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

4

8 回答 8

158

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

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


将数据写入 Firebase 时,您有几个不同的选项可以反映不同的用例。概括地说,Firebase 是一个树形结构的 NoSQL 数据存储,并提供了一些简单的原语来管理数据列表:

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

    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(),您不再需要为子属性的查询创建自己的索引!例如,要检索名称为“Alex”的所有用户:

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

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

当您在 Firebase 中写入数据时,您可以set使用唯一的、已定义的路径 (ie a/b/c) 或push将数据写入列表,这将生成唯一的 id (ie 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 });

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

于 2013-02-19T18:47:01.363 回答
6

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

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()); 
                    }
于 2017-01-09T13:17:40.357 回答
4

我认为最好的方法是根据 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');
于 2016-01-25T15:15:47.883 回答
2

这是对尝试访问自动生成的唯一 ID 时帮助我的帖子的解释。使用 angularFire 隐式同步在 ng-repeat 中访问 Firebase 唯一 ID

谢谢, bennlich(来源):

Firebase 的行为类似于普通的 javascript 对象。也许下面的例子可以让你走上正轨。

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

编辑:不是 100% 确定您想要的结果,但这里有更多可能会引发“啊哈”时刻。在 Firebase 仪表板中单击您尝试访问的密钥。从那里你可以使用类似的东西:

var ref = new Firebase("https://online-b-cards.firebaseio.com/users/<userId>/name);
    ref.once('value', function(snapshot) {
        $scope.variable= snapshot.val();
});
于 2015-02-27T08:01:11.757 回答
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);
});
于 2017-03-21T06:02:28.687 回答
1

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

将生成该随机密钥的函数。但请改用.update(){}您可以指定孩子姓名而不是随机密钥的功能。

于 2017-12-13T15:57:12.820 回答
1

检索数据:

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

在 Android 应用中使用 Firebase:

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

在 Javascript 中使用 Firebase:

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

在这里,您有快照(数据的位置),users然后您在所有随机 ID 中循环并检索名称。


检索特定用户的数据:

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

在 Android 应用中使用 Firebase:

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

将 Firebase 与 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 并附加一个侦听器以检索该用户的其他数据:

在 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 与 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;
   });
 
于 2018-06-27T10:39:08.197 回答
0

根据经过身份验证的用户向您的数据库添加唯一 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

于 2017-03-31T18:58:23.787 回答