如何在 Android 上的 Firebase 存储中设置持久性?
Posted
技术标签:
【中文标题】如何在 Android 上的 Firebase 存储中设置持久性?【英文标题】:How to set persistence in Firebase Storage on Android? 【发布时间】:2018-01-26 14:41:59 【问题描述】:我正在使用 Firebase Storage 获取 android 上的图像列表,但每次启动应用程序时都会下载此列表,我希望将图像持久存储在 Android 上并仅在必要时下载。所以我需要检查将下载的图像是否已经在智能手机上。我正在使用 FirebaseDatabase 来存储文件的名称,对于数据库,我可以检查持久性。我认为需要在设备的存储上存储图像,但我不知道在下载前检查,所以最好的方法是尽可能设置持久性 FirebaseStorage。
我的代码如下所示:
Firebase 数据库:
final FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference databaseReference = database.getReference().child("nomes_imagens");
final Map<String,Object> mapNomesImagens = new HashMap<>();
databaseReference.addListenerForSingleValueEvent(new ValueEventListener()
@Override
public void onDataChange(DataSnapshot dataSnapshot)
Log.i(TAG,"onDataChanged()");
Iterator<DataSnapshot> iterator = dataSnapshot.getChildren().iterator();
while( iterator.hasNext() )
DataSnapshot snapshot = iterator.next();
mapNomesImagens.put(snapshot.getKey(),snapshot.getValue());
n1++;
makeList(mapNomesImagens);
Log.i(TAG,"Mapa: " + mapNomesImagens.toString());
@Override
public void onCancelled(DatabaseError databaseError)
Log.i(TAG,"onCancelled");
);
Firebase 存储:
public boolean makeList(Map<String,Object> map)
final FirebaseStorage storage = FirebaseStorage.getInstance();
try
Set<String> set = map.keySet();
for(final String nomeExercicio : set)
String nomeArquivo = String.valueOf(map.get(nomeExercicio));
final File localFile = File.createTempFile("ImagensExercicios","bmp");
storage.getReference().child("ImagensExercicios").child(nomeArquivo).getFile(localFile).
addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>()
@Override
public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot)
Log.i(TAG,"onSuccess()");
Bitmap bitmap;
bitmap = BitmapFactory.decodeFile(localFile.getAbsolutePath());
Exercicio exercicio = new Exercicio(nomeExercicio,bitmap);
exercicios.add(exercicio);
n++;
).
addOnFailureListener(new OnFailureListener()
@Override
public void onFailure(@NonNull Exception e)
Log.i(TAG,"onFailure() " + e.getMessage());
).
addOnCompleteListener(new OnCompleteListener<FileDownloadTask.TaskSnapshot>()
@Override
public void onComplete(@NonNull Task<FileDownloadTask.TaskSnapshot> task)
Log.i(TAG,"onComplete()");
);
return true;
catch (Exception e)
e.printStackTrace();
return false;
【问题讨论】:
【参考方案1】:AFAIK setpersistence 启用旨在用于离线数据存储。所以它会在互联网可用时刷新。
您可以使用 Glide 库来处理缓存。下面给出的 Glide 的官方 firebase 使用必须足够。
链接:https://github.com/firebase/FirebaseUI-Android/tree/master/storage
要从 StorageReference 加载图像,只需使用 FirebaseImageLoader 类:
// Reference to an image file in Cloud Storage StorageReference storageReference = ...; // ImageView in your Activity ImageView imageView = ...; // Load the image using Glide Glide.with(this /* context */) .using(new FirebaseImageLoader()) .load(storageReference) .into(imageView);
【讨论】:
【参考方案2】:在手机中发送图片路径或 URI,创建房间 android 数据库,或者如果你擅长持久化,那也可以。使用正则表达式或正则表达式来帮助计算从 firebase 到 phone 路径的 URI 路径。
如果两个 URI 都匹配则文件存在则无需下载,但如果 URI 不匹配则文件不存在则触发下载过程
记住正则表达式或正则表达式
【讨论】:
以上是关于如何在 Android 上的 Firebase 存储中设置持久性?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Android 上的 Firebase DataSnapshot 中提取对象列表
如何从 Android 上的 Firebase DataSnapshot 中提取对象列表