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

时间:2013-02-19 17:31:16

标签: firebase firebase-realtime-database

我正在尝试创建一个应用程序,我可以在特定用户帐户中获取/设置数据,但我受到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

我环顾四周,当他们获得一些随机哈希作为他们的身份证时,我找不到任何关于如何访问个人数据的信息。

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

8 个答案:

答案 0 :(得分:154)

以前,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. 通过属性值
  5. 过滤订单列表中的数据:

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

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

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

    在Firebase中写入数据时,您可以使用唯一的,定义的路径(即set)或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>直接访问用户的数据。例如:

    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 :(得分:5)

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

double foo(const Eigen::VectorXd &x, const Eigen::VectorXd &meanVec, const Eigen::MatrixXd &covMat)
{
    // avoid magic numbers in your code. Compilers will be able to compute this at compile time:
    const double logSqrt2Pi = 0.5*std::log(2*M_PI);
    typedef Eigen::LLT<Eigen::MatrixXd> Chol;
    Chol chol(covMat);
    // Handle non positive definite covariance somehow:
    if(chol.info()!=Eigen::Success) throw "decomposition failed!";
    const Chol::Traits::MatrixL& L = chol.matrixL();
    double quadform = (L.solve(x - meanVec)).squaredNorm();
    return std::exp(-x.rows()*logSqrt2Pi - 0.5*quadform) / L.determinant();
}

答案 2 :(得分:4)

我认为最好的方法是根据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');

答案 3 :(得分:2)

这是在试图访问自动生成的唯一ID时帮助我的帖子的解释。 Access Firebase unique ids within ng-repeat using angularFire implicit sync

谢谢,bennlich(来源):

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

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

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

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

答案 4 :(得分: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);
});

答案 5 :(得分:1)

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

将生成该随机密钥的函数。但是请使用then函数,您可以在其中指定子项的名称,而不是使用随机键。

答案 6 :(得分:1)

检索数据:

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

在Android App中使用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 App中使用Firebase:

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

通过Java使用Firebase

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

通过Java使用Firebase:

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

答案 7 :(得分: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