You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firestore仅单次保存图片URL与用户数据的问题解决咨询

问题分析与解决方案

核心问题:文档ID重复导致数据覆盖

你的images集合用user_id作为文档ID,每次调用set(userMap)时会直接覆盖该ID对应的已有文档,因此只能保留最后一次上传的商品数据。每个用户应该对应多个独立的商品文档,而非单个文档。

次要问题:下载URL获取方式错误

用while(!uriTask.isSuccessful());阻塞主线程的做法不合理,会引发UI卡顿甚至ANR,应当采用异步监听的方式获取下载URL。

额外优化:参数未合理利用

SavingToFirestore方法接收了url参数,但代码中却使用全局变量downloadurl,容易引发数据不一致问题,建议直接使用传入的参数。


修改后的uploadImageToStorage方法

private void uploadImageToStorage() {
    if (filepath != null) {
        ProgressDialog progressDialog = new ProgressDialog(AddItem.this);
        progressDialog.setTitle("Uploading...");
        progressDialog.show();

        StorageReference ref = storageReference.child("images/" + UUID.randomUUID().toString());
        ref.putFile(filepath)
                .addOnSuccessListener(taskSnapshot -> {
                    // 异步监听获取下载URL,避免阻塞主线程
                    taskSnapshot.getStorage().getDownloadUrl().addOnSuccessListener(uri -> {
                        String downloadUrl = uri.toString();
                        SavingToFirestore(downloadUrl);
                        progressDialog.dismiss();
                    }).addOnFailureListener(e -> {
                        progressDialog.dismiss();
                        Toast.makeText(AddItem.this, "获取下载链接失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
                    });
                })
                .addOnFailureListener(e -> {
                    progressDialog.dismiss();
                    Toast.makeText(AddItem.this, "上传失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
                })
                .addOnProgressListener(taskSnapshot -> {
                    double progress = (100.0 * taskSnapshot.getBytesTransferred() / taskSnapshot.getTotalByteCount());
                    progressDialog.setMessage("Uploaded " + (int) progress + "%");
                });
    }
}

修改后的SavingToFirestore方法

private void SavingToFirestore(String url){
    Map<String,String> userMap = new HashMap<>();
    userMap.put("name", name);
    userMap.put("price", price);
    userMap.put("description", description);
    userMap.put("image", url);
    // 用add()方法让Firestore自动生成唯一文档ID,每个商品对应独立文档
    firebaseFirestore.collection("images")
            .add(userMap)
            .addOnSuccessListener(documentReference -> {
                itemName.setText("");
                itemPrice.setText("");
                itemDescription.setText("");
                itemImage.setImageResource(R.drawable.itemphoto);
                Toast.makeText(AddItem.this,"商品上传成功😃🎉",Toast.LENGTH_LONG).show();
                Intent intent = new Intent(AddItem.this,MainActivity.class);
                startActivity(intent);
            })
            .addOnFailureListener(e -> {
                Toast.makeText(AddItem.this,"错误: "+e.getMessage(),Toast.LENGTH_SHORT).show();
            });
}

可选优化:关联用户与商品

如果需要明确每个商品所属用户,可在商品数据中添加userId字段:

userMap.put("userId", user_id); // 添加用户ID字段

后续查询某用户的所有商品时,可使用:

firebaseFirestore.collection("images")
        .whereEqualTo("userId", user_id)
        .get()
        .addOnSuccessListener(queryDocumentSnapshots -> {
            // 处理用户的所有商品数据
        });

内容的提问来源于stack exchange,提问作者jayCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 12:30:59