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

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

我四处看了看,实际上找不到任何关于如何访问个人数据的信息,更不用说给他们一些随机散列作为他们的 ID 了。

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

90684 次浏览

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

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


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

  1. 用一个唯一的、已知的键写 到 Firebase:

    ref.child('users').child('123').set({ "first_name": "rob", "age": 28 })
    
  2. Append to lists with an auto-generated key that will automatically sort by time written:

    ref.child('users').push({ "first_name": "rob", "age": 28 })
    
  3. Listen for changes in data by its unique, known path:

    ref.child('users').child('123').on('value', function(snapshot) { ... })
    
  4. Filter or order data in a list by key or attribute value:

    // 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', ...)
    

With the addition of orderByChild(), you no longer need to create your own index for queries on child attributes! For example, to retrieve all users with the name "Alex":

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

我是 Firebase 的工程师。在将数据写入 Firebase 时,您有几个不同的选项,它们将反映不同的应用程序用例。因为 Firebase 是一个 NoSQL 数据存储,所以你需要用唯一的键来存储你的数据对象,这样你就可以直接访问这个条目,或者在特定的位置加载所有的数据,然后循环遍历每个条目来找到你要找的节点。有关更多信息,请参见 编写数据管理名单

当你在 Firebase 中写入数据时,你可以使用一个唯一的、定义好的路径(比如 a/b/c)写入 set数据,或者将 push数据写入一个列表,这将生成一个唯一的 id (比如 a/b/<unique-id>) ,并允许你按时间对列表中的项目进行排序和查询。您在上面看到的惟一 id 是通过调用 pushonline-b-cards/users的列表中追加一个项而生成的。

与其在这里使用 push,我建议使用 set,并使用一个唯一的键(如用户的电子邮件地址)为每个用户存储数据。然后,您可以通过 FirebaseJSSDK 导航到 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 不允许在引用中使用某些字符(参见 创建引用) ,因此我们删除了 .,并在上面的代码中用 ,替换它。

这是对一篇文章的解释,它帮助我在尝试访问自动生成的唯一 id.使用 angularFire 隐式同步在 ng- 重复内访问 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 提供的 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 认证服务将始终确保其所有提供者之间的唯一 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());
}

以下是如何访问 Firebase 中自动生成的唯一密钥: 资料结构 : - 在线 Bcard 独一无二的钥匙

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

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

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

产生随机密钥的函数。但是可以使用 .update(){}函数,在该函数中您可以指定子元素的名称,而不是使用随机键。

检索数据:

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

在 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() {...}

在 Javascript 中使用 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 Authentication,这样可以为每个用户生成一个惟一的 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) {
}
});

通过 Javascript 使用 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;
});