java - 如何将每个用户链接到他们在 Firebase 中的数据?
问题描述
我正在尝试建立一个下订单系统。
通过电子邮件验证用户后,它可以创建/更新/删除订单。订单保存在 Firebase 实时数据库中,用户保存在身份验证中。
我希望允许用户仅查看/编辑此特定用户下的订单。基本上使用来自身份验证部分的 UserUID。
public class FirebaseDatabaseHelper {
private FirebaseDatabase mDatabase;
private DatabaseReference mReferenceOrders;
private List<Order> orders = new ArrayList<>();
public interface DataStatus{
void DataIsLoaded(List<Order> orders, List<String> keys);
void DataIsInserted();
void DataIsUpdated();
void DataIsDeleted();
}
//Initialize Database object
public FirebaseDatabaseHelper() {
mDatabase = FirebaseDatabase.getInstance();
mReferenceOrders = ((FirebaseDatabase) mDatabase).getReference("order");
}
public void readOrders(final DataStatus dataStatus){
mReferenceOrders.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
orders.clear();
List<String> keys = new ArrayList<>();
for(DataSnapshot keyNode : dataSnapshot.getChildren()) {
keys.add(keyNode.getKey());
Order order = keyNode.getValue(Order.class);
orders.add(order);
}
dataStatus.DataIsLoaded(orders,keys);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
public void addOrder(Order order, final DataStatus dataStatus) {
String key = mReferenceOrders.push().getKey();
mReferenceOrders.child(key).setValue(order).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
dataStatus.DataIsInserted();
}
});
}
// Update and Delete methods
public void updateOrder(String key, Order order, final DataStatus dataStatus){
mReferenceOrders.child(key).setValue(order).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
dataStatus.DataIsUpdated();
}
});
}
public void deleteOrder(String key, final DataStatus dataStatus){
mReferenceOrders.child(key).setValue(null).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
dataStatus.DataIsDeleted();
}
});
}
}
这就是我的想法:
当用户创建一个新订单时,一个 UserUID 被添加到数据库中并嵌套在“订单”中,因此现在每个订单都可以分配给创建它的用户。
现在下一步是向创建它的用户显示此订单,但前提是 cust_id(按顺序)与登录用户的 UserUID 匹配。那会是一个好方法吗?
解决方案
我user_id
在 Firebase 数据库中的“订单”中添加了一个,因此每个订单都可以分配给它的用户。
当新用户登录/登录时,我user_id
通过从 Firebase 的身份验证部分获取 UserUID 来获取参数。
Firebase 身份验证部分中的 UserUID 屏幕截图
通过添加以下内容,我在代码中得到了这个值:
private FirebaseAuth mAuth;
order.setUser_id(mAuth.getCurrentUser().getUid());
一旦我得到user_id
分配给每个订单,我就创建了以下 if 语句,该语句在我的readOrders
函数中实现,您可以在上面的原始帖子中看到:
public void readOrders(final DataStatus dataStatus){
mReferenceOrders.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
orders.clear();
List<String> keys = new ArrayList<>();
for(DataSnapshot keyNode : dataSnapshot.getChildren()) {
keys.add(keyNode.getKey());
Order order = keyNode.getValue(Order.class);
**if (order.getUser_id().equals(mAuth.getUid())) {
Log.d("FirebaseDatabaseHelper", "match");
orders.add(order);
}else {
Log.d("FirebaseDatabaseHelper", "error");
}**
}
dataStatus.DataIsLoaded(orders,keys);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
所以基本上现在当新用户登录时,不会有任何显示,因为user_id
不会与 Order 数据库中的任何 user_id 匹配。
我不确定当添加更多用户/订单时这种方法的效率如何,所以我必须做一些测试。
请告知这是否是最好的方法!
推荐阅读
- parsing - 数学:是否可以遍历节点树并使用 RPN 对其进行解析?
- css - 如何使用 position: absolute without Overlapping 在垂直方向放置 HTML 元素
- javascript - 如何使按钮拾取功能
- javascript - 在嵌套对象中设置值
- python - 在 python 中,我不能在 loo 交叉验证中给出一个值,除了使用 svm 时为零。我该如何修复它?
- javascript - Javascript - 尝试从数组中随机选择并根据所选择的内容填充内部 HTML - 不工作
- java - 如何在 Java 中解析 xml 时修复 JAXB 错误?
- javascript - React - 存储为变量的组件未在嵌套组件中呈现
- reactjs - 如何在本地为 axios get 方法连接我的 XML 文件
- sql-server - 使用 FOR JSON AUTO 语法时删除空 json 对象