如何在 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获取用户uid?

如何从 Android 上的 Firebase DataSnapshot 中提取对象列表

如何从 Android 上的 Firebase DataSnapshot 中提取对象列表

关闭 Firebase 上的实时更改 (Android)

我如何在Android应用上运行自动机器人测试?就像Firebase测试实验室上的那个]] << [

android上的firebase设置