首页 > 解决方案 > 如何将每个用户链接到他们在 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 被添加到数据库中并嵌套在“订单”中,因此现在每个订单都可以分配给创建它的用户。

Firebase 实时数据库截图:order

现在下一步是向创建它的用户显示此订单,但前提是 cust_id(按顺序)与登录用户的 UserUID 匹配。那会是一个好方法吗?

标签: javaandroidfirebasefirebase-realtime-database

解决方案


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 匹配。

我不确定当添加更多用户/订单时这种方法的效率如何,所以我必须做一些测试。

请告知这是否是最好的方法!


推荐阅读