在 Android 中的 CSV 上打印 Firebase 数据集

Posted

技术标签:

【中文标题】在 Android 中的 CSV 上打印 Firebase 数据集【英文标题】:Print Firebase dataset on CSV in Android 【发布时间】:2020-09-12 10:31:37 【问题描述】:

我正在开发一个 android 应用程序,用于扫描附近的蓝牙设备并获取这些设备的详细信息。详细信息意味着设备名称、设备地址、RSSI 之类的。然后我将这些数据发送到 firebase 实时数据库。下面我提到了我的数据库结构。

我想检索特定的数据集并将这些数据加载到 csv 文件中的表中 这里我已经提到了我是如何获取数据集的

protected void onStart() 
    super.onStart();

    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("BluetoothDevicesInfo");

    reference.orderByChild("deviceId").equalTo("C6:89:AF:D6:7B:83").addListenerForSingleValueEvent(new ValueEventListener() 
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) 
            for(DataSnapshot deviceInf: dataSnapshot.getChildren())
                String deviceId= deviceInf.child("deviceId").getValue().toString();
                Map<String, String> value = (Map<String, String>) dataSnapshot.getValue();
                Log.i("dataSnapshot", "dataSnapshot : " + new JSONObject(value));
            
        
        @Override
        public void onCancelled(DatabaseError databaseError) 
        
    );

输出

"-M8Bu8znHpC4EAstfPLf": 
"rssi":-92,"distance":1,"deviceId":"C6:89:AF:D6:7B:83","timestamp":"25-05-202023:06:52", 
 "-M8Bu8zOuBZjgkkSUcnG": 
"rssi":-92,"distance":1,"deviceId":"C6:89:AF:D6:7B:83","timestamp":"25-05-2020 23:06:52"

如何在 CSV 上打印此内容

【问题讨论】:

您想要 csv 上的内部对象还是整行? rssi distance deviceIdtimestamp 有对应的值,但“-M8Bu8znHpC4EAstfPLf”没有。 是的。我只想要 rssi、距离、id 和时间戳 【参考方案1】:

将这两个添加到各自的位置。

Doc

maven url 'https://jitpack.io'

implementation 'com.github.hsmnzaydn:easy-csv:1.0.0'.

声明一些全局变量

List<String> headerList = new ArrayList<>();
List<String> dataList = new ArrayList<>();
Snapobj snap ;
List<Snapobj > snapList = new ArrayList<Snapobj>();
public final int WRITE_PERMISSON_REQUEST_CODE =1;

onCreate 内部

 EasyCsv easyCsv = new EasyCsv(MainActivity.this);
 easyCsv.setSeparatorColumn("^");
 easyCsv.setSeperatorLine("~");
 headerList.add("rssi^distance^deviceId^timestamp~");

创建一个 Snapobj 类

public class Snapobj 
String rssi;
String distance;
String deviceId;
String timestamp;

public Snapobj(String rssi, String distance, String deviceId, String timestamp) 
    this.rssi = rssi;
    this.distance = distance;
    this.deviceId = deviceId;
    this.timestamp = timestamp;

  //Add Getters and Setters

现在我们将在 onDataChange 内部填充 snapList

public void onDataChange(DataSnapshot dataSnapshot) 
  for(DataSnapshot deviceInf: dataSnapshot.getChildren())
      snapList.add(new Snapobj("pass rssi","pass distance","deviceId","timestamp"));
    

现在我们需要为数据列表数组构造字符串。创建一个函数并放入这些行

for(Snapobj s : snapList)

  String s = s.getRssi()+"^"+s.getDistance()+"^"+s.getDeviceId()+"^"+s.getTimestamp()+"~";
  dataList.add(s);

最后创建 csv 文件。

easyCsv.createCsvFile("MyFile", headerList, dataList WRITE_PERMISSON_REQUEST_CODE, new 
FileCallback() 
@Override
public void onSuccess(File file) 
Log.d(TAG, "File saved in phone storage");
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(MainActivity.this,"com.example.mafiacsv.fileprovider",file));
sendIntent.setType("text/*");
sendIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Intent shareIntent = Intent.createChooser(sendIntent, null);
startActivity(shareIntent);


@Override
public void onFail(String err) 

);

把它放在 ManifestFile 中的应用标签内

    <provider
        android:name=".GenericFileProvider"
        android:authorities="com.example.mafiacsv.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>
    </provider>

创建一个只扩展 FileProvider 的空类。

  import androidx.core.content.FileProvider;
  public class GenericFileProvider extends FileProvider 

文件成功创建并保存到手机内部存储时调用onSuccess。

Important

确保 rssi、距离、id 和时间戳的值不包含“^”和“~”,否则将无法正常工作。我们需要两个唯一的符号来告诉库何时换行和何时分隔列。

别忘了询问WRITE_EXTERNAL_STORAGE的权限。

【讨论】:

在哪里可以找到文件。 onSuccess 被调用但找不到文件 我不能将这些数据存储在我运行 android studio 的计算机文件存储中 您会在手机的内部存储中找到您的文件。它将存储在根级别,名称为 MyFile.csv 我在 onSuccess 中添加了一些代码。现在完成后,您将能够看到一个 Intent 选择器,您可以从中直接打开文件。

以上是关于在 Android 中的 CSV 上打印 Firebase 数据集的主要内容,如果未能解决你的问题,请参考以下文章

如何区分 Android 应用程序是不是在 Amazon Kindle Fire 上运行?

在 Amazon Fire TV 应用商店上兼容/提供 Android TV 应用程序有多难?

在 kindle fire 上调试安卓应用

卡在 Android TV / Fire TV 的 Charles 代理证书安装中

检测应用程序正在 Kindle Fire 上运行

Android 应用在 Amazon Fire TV 中无响应