我怎样才能得到卖家的产品

Posted

技术标签:

【中文标题】我怎样才能得到卖家的产品【英文标题】:how can I get the products of the sellers 【发布时间】:2019-08-04 04:36:32 【问题描述】:

我比较了其他问题,但他们有不同的问题。 我的问题是,如何(在用户活动中)显示卖家在 firebase 数据库中添加的所有产品? 卖家在添加产品之前有自己的注册和登录活动,这意味着每个卖家都将拥有自己的姓名或 ID。 您可以在下图中查看我的数据库示例。

**Sorry guys I have updated the code but now it is crashing the app every time I click the button to go to the add products activity**

公共类 SellerAddProductActivity 扩展 AppCompatActivity

private String saveCurrentDate;
private String saveCurrentTime;
private String CategoryName;
private String downloadImageUrl;
private String productRandomKey;
private String Description;
private String Price, Quantity, State;
private String Pname, Store;
private Button AddProductButton;
private EditText InputProductName;
private EditText InputProductPrice, InputStoreName;
private EditText InputProductDescription, InputProductQauntity, InputProductState;
private StorageReference ProductImageRef;
private Uri ImageUri;
private DatabaseReference ProductsRef, ProductsInfo;
private ProgressDialog loadingBar;
private static final int GalleryPick = 1;
private ImageView InputProductImage;

FirebaseUser currentUser;
FirebaseUser mAuth;
String userID = mAuth.getUid(); //--> Store each seller name with this ID

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_seller_add_product);

    ProductImageRef = FirebaseStorage.getInstance().getReference().child("Product Images");

    CategoryName = getIntent().getExtras().get("category").toString();
    ProductsRef = FirebaseDatabase.getInstance().getReference().child("Products");
    ProductsInfo = FirebaseDatabase.getInstance().getReference().child("ProductsInfo");
    mAuth = FirebaseAuth.getInstance().getCurrentUser();

    AddProductButton = (Button) findViewById(R.id.add_product);
    InputProductName = (EditText) findViewById(R.id.product_name);
    InputProductImage = (ImageView) findViewById(R.id.product_image_select);
    InputProductPrice = (EditText) findViewById(R.id.product_price);
    InputProductQauntity = (EditText) findViewById(R.id.product_quantity);
    InputProductState = (EditText) findViewById(R.id.product_state);
    InputStoreName = (EditText) findViewById(R.id.store_name);

    loadingBar = new ProgressDialog(this);
    InputProductDescription = (EditText) findViewById(R.id.product_description);

    InputProductImage.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            OpenGallery();
        
    );
    AddProductButton.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            validateProductData();
        
    );

private void OpenGallery() 
    Intent galleryIntent = new Intent();
    galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
    galleryIntent.setType("image/*");
    startActivityForResult(galleryIntent, GalleryPick);

@Override
protected void onActivityResult
        (int requestCode, int resultCode, @Nullable Intent data) 
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == GalleryPick && resultCode == RESULT_OK && data != null) 
        ImageUri = data.getData();
        InputProductImage.setImageURI(ImageUri);
    

private void validateProductData() 
    Description = InputProductDescription.getText().toString();
    Price = InputProductPrice.getText().toString();
    Pname = InputProductName.getText().toString();
    Quantity = InputProductQauntity.getText().toString();
    State = InputProductState.getText().toString();
    Store = InputStoreName.getText().toString();


    if (ImageUri == null) 
        Toast.makeText(this, "Please Add Product Image!", Toast.LENGTH_SHORT).show();
     else if (TextUtils.isEmpty(Description)) 
        Toast.makeText(this, "Please Enter the Product Description!", Toast.LENGTH_SHORT).show();
     else if (TextUtils.isEmpty(Price)) 
        Toast.makeText(this, "Please Enter the Product Price!", Toast.LENGTH_SHORT).show();
     else if (TextUtils.isEmpty(Pname)) 
        Toast.makeText(this, "Please Enter the Product Name!", Toast.LENGTH_SHORT).show();
     else if (TextUtils.isEmpty(Quantity)) 
        Toast.makeText(this, "Enter Quantity in Number!", Toast.LENGTH_SHORT).show();
     else if (TextUtils.isEmpty(State)) 
        Toast.makeText(this, "Specify the State of your Product!", Toast.LENGTH_SHORT).show();
     else if (TextUtils.isEmpty(Store)) 
        Toast.makeText(this, "Store Name is Mandatory!", Toast.LENGTH_SHORT).show();
     else 
        StoreProductInfo();
    

private void StoreProductInfo() 

    loadingBar.setTitle("Adding Product");
    loadingBar.setMessage("Please wait!");
    loadingBar.setCanceledOnTouchOutside(false);
    loadingBar.show();

    Calendar calendar = Calendar.getInstance();
    SimpleDateFormat currentDate = new SimpleDateFormat("MMM dd, yyyy");
    saveCurrentDate = currentDate.format(calendar.getTime());

    SimpleDateFormat currentTime = new SimpleDateFormat("HH:mm:ss a");
    saveCurrentTime = currentTime.format(calendar.getTime());

    // Unique Random Key for the Products added by the admin
    productRandomKey = saveCurrentDate + saveCurrentTime;

    // Unique Random Key to store the image added by the admin
    final StorageReference filePath = ProductImageRef.
            child(ImageUri.getLastPathSegment() + productRandomKey + ".jpg");
    final UploadTask uploadTask = filePath.putFile(ImageUri);

    //Displaying the Upload Error to the seller
    uploadTask.addOnFailureListener(new OnFailureListener() 
        @Override
        public void onFailure(@NonNull Exception e) 
            String message = e.toString();
            Toast.makeText(SellerAddProductActivity.this, "Error: " + message, Toast.LENGTH_SHORT).show();
            loadingBar.dismiss();
        
    ).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() 
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) 
            Toast.makeText(SellerAddProductActivity.this, "Image Uploaded!", Toast.LENGTH_SHORT).show();
            Task<Uri> uriTask = uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() 
                @Override
                public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception 
                    if (!task.isSuccessful()) 
                        throw task.getException();
                    
                    downloadImageUrl = filePath.getDownloadUrl().toString();
                    return filePath.getDownloadUrl();
                
            ).addOnCompleteListener(new OnCompleteListener<Uri>() 
                @Override
                public void onComplete(@NonNull Task<Uri> task) 
                    if (task.isSuccessful()) 
                        downloadImageUrl = task.getResult().toString();
                        Toast.makeText(SellerAddProductActivity.this, "Product Image Added",

toast.length_short).show();

                        SaveProductInfoToDatabase();
                    
                
            );
        
    );

private void SaveProductInfoToDatabase() 
    HashMap<String, Object> productMap = new HashMap<>();

    productMap.put("pid", productRandomKey);
    productMap.put("storename", Store);
    productMap.put("date", saveCurrentDate);
    productMap.put("time", saveCurrentTime);
    productMap.put("description", Description);
    productMap.put("image", downloadImageUrl);
    productMap.put("Category", CategoryName);
    productMap.put("state", State);
    productMap.put("quantity", Quantity);
    productMap.put("price", Price);
    productMap.put("pname", Pname);

    ProductsRef.child("Products").child(userID).child(productRandomKey);

    ProductsInfo.child(productRandomKey).updateChildren(productMap)
            .addOnCompleteListener(new OnCompleteListener<Void>() 
                @Override
                public void onComplete(@NonNull Task<Void> task) 
                    if (task.isSuccessful()) 
                        Intent intent = new Intent(SellerAddProductActivity.this, SellerAddProductActivity.class);
                        startActivity(intent);
                        loadingBar.dismiss();
                        Toast.makeText(SellerAddProductActivity.this, "Product

添加“,toast.length_short).show(); 别的 loadingBar.dismiss(); 字符串message = task.getexception()。ToString(); Toast.MakeText(SellerAddProductivity.this, “错误:”+消息,toast.length_short).show(); );

这就是我在买家/用户活动中展示产品的方式

公共类 HomeActivity 扩展 AppCompatActivity 实现 NavigationView.annavigationItemselectedListener

    private DatabaseReference productsRef;
    private RecyclerView recyclerView;
    RecyclerView.LayoutManager layoutManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        productsRef = FirebaseDatabase.getInstance().getReference().child("Products");
        recyclerView = findViewById(R.id.recycler_menu);
        recyclerView.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
    

    @Override
    protected void onStart() 
        super.onStart();

        FirebaseRecyclerOptions<Products> options =
                new FirebaseRecyclerOptions.Builder<Products>()
                        .setQuery(productsRef, Products.class).build();
        FirebaseRecyclerAdapter<Products, ProductsViewHolder> adapter
                = new FirebaseRecyclerAdapter<Products, ProductsViewHolder>(options) 

            @Override
            protected void onBindViewHolder(@NonNull ProductsViewHolder holder,int position,@NonNull final Products model)

                holder.txtProductName.setText(model.getPname());
                holder.txtProductPrice.setText("Price " + model.getPrice() + "$");
                Picasso.get().load(model.getImage()).into(holder.imageView);

                //sending the product ID to the ProductDetailsActivity
                holder.itemView.setOnClickListener(new View.OnClickListener() 
                    @Override
                    public void onClick(View v) 
                        Intent intent = new Intent(HomeActivity.this, ProductDetailsActivity.class);
                        intent.putExtra("pid", model.getPid());
                        startActivity(intent);
                    
                );

            

            @NonNull
            @Override
            public ProductsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) 
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_products,parent,false);

                ProductsViewHolder holder = new ProductsViewHolder(view);
                return holder;
            
        ;
        GridLayoutManager gridLayoutManager = new GridLayoutManager(getApplicationContext(), 2);
        recyclerView.setLayoutManager(gridLayoutManager);
        adapter.startListening();
        recyclerView.setAdapter(adapter);
    

【问题讨论】:

请添加数据库样本。 span> 【参考方案1】:

据我了解,您希望将所有卖家信息显示给在您的应用中登录的人。

为此,您可以在产品内部执行 for 循环以获取每个卖家 ID,然后查询每个用户以获取产品。

但您需要更改数据库结构以使其更容易。

我建议您在嵌套子产品中存储该产品的 ID 以在另一个表中查询。例如

Products
    |
    --- userID
           |
           --- Products
                 |
                 --- product_key1: true
                 |
                 --- product_key2: true

然后在另一个节点有那个产品的信息

ProductsInfo
    |
    --- product_key1
    |            |
    |            --- productName: "Orange"
    |            |
    |            --- productPrice: 1
    |
    --- product_key2
                 |
                 --- productName: "Pineapple"
                 |
                 --- productPrice: 3

所以现在,我们将只获取每个用户 ID 并获取每个用户的产品

首先,您应该使用getUid() 来获取每个卖家唯一的 UID,而不是硬编码卖家名称。

FirebaseAuth mAuth;
mAuth = FirebaseAuth.getInstance().getCurrentUser();
String userID = mAuth.getUid(); //--> Store each seller name with this ID

现在我们只需在 Products 中循环获取每个用户 ID

mRef.addValueEventListener(new ValueEventListener() 
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) 
       for(DataSnapshot ds : dataSnapshot.getChildren()) 
            String userKey = ds.getKey();
            Log.d("SellersID", userKey);
        

    
    @Override
    public void onCancelled(DatabaseError databaseError) 

    
);

现在您拥有所有卖家密钥,您可以在 products 内循环并获取每个卖家的每个产品密钥,然后您现在可以从 ProductsInfo 节点获取数据

【讨论】:

感谢您重播 Gastón Saillén。我需要为 FirebaseAuth 创建一个类吗?也许您想看看我是如何将产品添加到数据库中的。 表示模式的相同风格:) 伙计们,如果我必须在用户 HomeActivity(买家)或卖家(添加 productsActivity)中创建 FirebaseAuth 类,我仍然感到困惑。对不起,伙计们,我是新手使用 android studio 和 firebase 数据库。 @AlexMamo haha​​h,alt + 124 和下划线是我们的朋友 :) @user9833216 您不需要创建 FirebaseAuth 类,您在问题中说您已经有用户登录,只需更改放置 child("d")... for child(userID )【参考方案2】:

您的问题出在您的数据库参考productsRef

您应该根据您希望从数据库中获取的内容,在参考中添加更多内容:

productsRef = FirebaseDatabase.getInstance().getReference().child("Products").child("here you put seller name"); // in your case the seller name is "d"

希望对您有所帮助。想了解更多请咨询我

【讨论】:

如果我放“d”,只会显示卖家“d”的产品。我的想法是展示两个卖家或更多卖家的产品。

以上是关于我怎样才能得到卖家的产品的主要内容,如果未能解决你的问题,请参考以下文章

如何获取任何特定亚马逊商家/卖家的所有产品?

产品经理怎样才能找到进阶临界点?

TS/16949中的DFMEA怎样才能实际应用到工作中?

如何获取发布产品的人

优化产品主图详情图,寻找类似产品卖家,关联店铺其他产品,设置优惠卷

订单号怎样生成才能好用又好看,难倒了20多位产品经理