我正在尝试创建一个应用程序,我可以在特定用户帐户中获取/设置数据,但我受到Firebase的诱惑。
我遇到的问题是,当我的结构看起来像这样时,我不知道如何定位特定的用户数据:
online-b-cards
- users
- InnROTBVv6FznK81k3m
- email: "hello@hello"
- main: "Hello world this is a text"
- name: "Alex"
- phone: 12912912
我环顾四周,当他们获得一些随机哈希作为他们的身份证时,我找不到任何关于如何访问个人数据的信息。
我如何根据他们的名字获取个人用户信息?如果有更好的方法,请告诉我!
答案 0 :(得分:154)
以前,Firebase要求您生成自己的索引或下载某个位置的所有数据,以查找和检索与某些子属性匹配的元素(例如,所有name === "Alex"
的用户)
2014年10月,Firebase通过orderByChild()
方法推出了新的查询功能,使您能够快速有效地执行此类查询。请参阅下面的更新答案。
将数据写入Firebase时,您可以使用一些不同的选项来反映不同的用例。在较高的层面上,Firebase是一个树形结构的NoSQL数据存储,并提供了一些简单的原语来管理数据列表:
使用唯一的已知密钥将写入Firebase:
ref.child('users').child('123').set({ "first_name": "rob", "age": 28 })
将附加到带有自动生成密钥的列表中,该密钥将按写入的时间自动排序:
ref.child('users').push({ "first_name": "rob", "age": 28 })
通过其唯一的已知路径收听数据更改:
ref.child('users').child('123').on('value', function(snapshot) { ... })
过滤或订单列表中的数据:
// 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数据存储,因此您需要使用唯一键存储数据对象,以便您可以直接访问该项或加载特定位置的所有数据,并遍历每个项以查找您要查找的节点。有关详细信息,请参阅Writing Data和Managing 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