在 Android 中以 CSV 格式打印 Firebase 数据集
Print Firebase dataset on CSV in Android
我正在开发一个 android 应用程序来扫描附近的蓝牙设备并获取这些设备的详细信息。详细信息是指设备名称、设备地址、RSSI 之类的。然后我将这些数据发送到 firebase 实时数据库。下面我提到了我的数据库结构。
我想检索特定数据集并将这些数据加载到 csv 文件中的 table
这里我已经提到了我如何获取数据集
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 文件中打印此文件
将这两个添加到各自的位置。
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 class
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"));
}
}
现在我们需要为数据列表构造字符串 array.Create 一个函数并将这些行
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 的空 class。
import androidx.core.content.FileProvider;
public class GenericFileProvider extends FileProvider {}
onSuccess 在文件成功创建并保存在 phone 的内部存储中时调用。
Important
确保rssi、距离、id和时间戳的值不包含'^'和'~',否则将无法正常工作。我们需要两个唯一的符号来告诉库何时换行以及何时分隔列。
别忘了请求 WRITE_EXTERNAL_STORAGE
许可。
我正在开发一个 android 应用程序来扫描附近的蓝牙设备并获取这些设备的详细信息。详细信息是指设备名称、设备地址、RSSI 之类的。然后我将这些数据发送到 firebase 实时数据库。下面我提到了我的数据库结构。
我想检索特定数据集并将这些数据加载到 csv 文件中的 table 这里我已经提到了我如何获取数据集
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 文件中打印此文件
将这两个添加到各自的位置。
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 class
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"));
}
}
现在我们需要为数据列表构造字符串 array.Create 一个函数并将这些行
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 的空 class。
import androidx.core.content.FileProvider;
public class GenericFileProvider extends FileProvider {}
onSuccess 在文件成功创建并保存在 phone 的内部存储中时调用。
Important
确保rssi、距离、id和时间戳的值不包含'^'和'~',否则将无法正常工作。我们需要两个唯一的符号来告诉库何时换行以及何时分隔列。
别忘了请求 WRITE_EXTERNAL_STORAGE
许可。