Распечатать набор данных Firebase в CSV в Android - PullRequest
0 голосов
/ 25 мая 2020

Я разрабатываю приложение android для сканирования ближайших устройств Bluetooth и получения сведений об этих устройствах. подробности означают имя устройства, адрес устройства, RSSI и т.п. Затем я отправляю эти данные в базу данных firebase в реальном времени. ниже я упомянул структуру моей базы данных.

enter image description here

Я хочу получить набор данных c и загрузить эти данные в таблицу в файле 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

1 Ответ

1 голос
/ 26 мая 2020

Добавьте эти два на их соответствующих позициях.

Do c

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, distance, id и timestamp не содержат '^' и '~', иначе это не будет работать должным образом. Нам нужны два уникальных символа, чтобы сообщить библиотеке, когда разрывать строку и когда отделять столбец.

Не забудьте спросить WRITE_EXTERNAL_STORAGE разрешения.

...