使用Firebase按名称获取用户

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

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

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

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

我环顾四周,我无法真正find任何关于如何访问个人数据,更不用说当他们被给予一些随机哈希作为他们的ID。

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

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

2014年10月,Firebase通过orderByChild()方法推出了新的查询function,使您能够快速有效地完成这种查询。 请参阅下面的更新的答案。


在向Firebase写入数据时,您会有几个不同的选项来反映不同的使用情况。 Firebase是一个树形结构的NoSQL数据存储,并提供了几个用于pipe理数据列表的简单基元:

  1. 使用独特的已知密钥写入 Firebase:

     ref.child('users').child('123').set({ "first_name": "rob", "age": 28 }) 
  2. 使用自动生成的密钥附加到列表,该密钥将按照时间自动sorting:

     ref.child('users').push({ "first_name": "rob", "age": 28 }) 
  3. 通过其独特的已知path来监听数据的变化:

     ref.child('users').child('123').on('value', function(snapshot) { ... }) 
  4. 按键属性值 过滤sorting列表中的数据:

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

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

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

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

我不推荐在这里使用push ,而是build议使用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不允许在引用中使用某些字符(请参阅创build引用 ),我们删除该引用 . 并用上面代码中的a代替。

我认为最好的方法是根据Firebase提供的身份validation对象来定义用户的ID。 当我创build我的用户时,我这样做:

 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身份validation服务将始终确保将其所有提供者中的唯一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()); } 

这是一个post的释义,帮助我尝试访问自动生成的唯一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(); }); 

这是如何访问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); }); 

根据经过authentication的用户,将最简单和最好的方法添加到您的数据库是这样的:

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