在Android Studio中用Java关联Firebase的行程表与图库表
Firebase行程与照片关联功能问题求助
我正在进行一个大学项目,Firebase中存在两个数据表:
- Gallery表:用于存储行程照片
- Itinerary表:用于存储用户的各类行程
我的需求是将行程ID与图片ID关联,让每个行程对应同一用户创建的照片。我编写了如下代码,但遇到了问题,希望能得到帮助。
public void addImageItinerary() { storageReference = FirebaseStorage.getInstance().getReference(); referenceDb = FirebaseDatabase.getInstance().getReference(); firestore = FirebaseFirestore.getInstance(); auth = FirebaseAuth.getInstance(); if (images != null) { StorageReference itineraryRef = storageReference.child("itinerary_image/" + FirebaseAuth.getInstance().getCurrentUser().getUid() + ".jpg"); itineraryRef.putFile(images).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() { @Override public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) { if (task.isSuccessful()) { itineraryRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() { @Override public void onSuccess(Uri uri) { String itineraryId = referenceDb.child("Itinerary").push().getKey(); Log.i("itineraryId", itineraryId); HashMap<String, Object> map = new HashMap<>(); map.put("image", uri.toString()); referenceDb.child("Gallery").child(FirebaseAuth.getInstance().getCurrentUser().getUid()+ "/" + itineraryId).setValue(map).addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { // APRO SCHERMATA MAPPA // openMapFragment(); Toast.makeText(insertImage_fragment.getActivity(), "ok", Toast.LENGTH_SHORT).show(); } else { //ERRORE Toast.makeText(insertImage_fragment.getActivity(), "Operation failed. Please try again", Toast.LENGTH_SHORT).show(); } } }); } }); } else { Toast.makeText(insertImage_fragment.getActivity(), task.getException().toString(), Toast.LENGTH_SHORT).show(); } } }); } else{ Toast.makeText(insertImage_fragment.getActivity(),"Please add image", Toast.LENGTH_SHORT).show(); } }
附数据表结构示意图
问题分析与修复建议
- 存储路径冲突问题:当前所有用户上传的照片都用
{uid}.jpg作为文件名,后上传的会直接覆盖之前的,导致图片丢失。建议生成唯一文件名,比如用行程ID:
// 替换原存储路径代码 String uniqueFileName = itineraryId + ".jpg"; StorageReference itineraryRef = storageReference.child("itinerary_image/" + FirebaseAuth.getInstance().getCurrentUser().getUid() + "/" + uniqueFileName);
- 关联逻辑不完整:代码仅在Gallery表中存储了行程ID关联的图片,但未在Itinerary表中同步记录图片信息。需补充Itinerary表的更新逻辑:
// 获取itineraryId后添加以下代码 HashMap<String, Object> itineraryMap = new HashMap<>(); itineraryMap.put("imageUrl", uri.toString()); // 补充行程其他必要字段(如名称、日期等) referenceDb.child("Itinerary").child(itineraryId).setValue(itineraryMap);
实例重复初始化:方法内每次调用都重新获取Firebase实例,建议将
storageReference、referenceDb等作为类成员变量初始化,避免重复创建。错误提示优化:当前错误提示过于笼统,可展示具体异常信息方便调试:
Toast.makeText(insertImage_fragment.getActivity(), "操作失败:" + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
- 空指针风险规避:调用
getCurrentUser()前需判断用户是否登录,避免空指针:
FirebaseUser currentUser = auth.getCurrentUser(); if (currentUser == null) { Toast.makeText(insertImage_fragment.getActivity(), "请先登录", Toast.LENGTH_SHORT).show(); return; } // 后续用currentUser.getUid()替代重复调用
内容的提问来源于stack exchange,提问作者saretta2
相关产品推荐
相关产品推荐

