From 3432bbf21de57f503befb46ed562e50cf19f0cbd Mon Sep 17 00:00:00 2001 From: OliE Date: Fri, 5 Jan 2018 18:35:14 +0100 Subject: [PATCH] Replaced CSV export/import function with SimpleCSV library source code --- android_app/app/build.gradle | 19 ++-- .../com/health/openscale/core/OpenScale.java | 93 ++++--------------- .../core/datatypes/ScaleMeasurement.java | 13 +++ .../gui/fragments/TableFragment.java | 30 +----- 4 files changed, 45 insertions(+), 110 deletions(-) diff --git a/android_app/app/build.gradle b/android_app/app/build.gradle index 79d76f1b..d9a2a7a9 100644 --- a/android_app/app/build.gradle +++ b/android_app/app/build.gradle @@ -37,15 +37,16 @@ ext { } dependencies { - compile "com.android.support:design:${supportLibVersion}" - compile "com.android.support:support-v4:${supportLibVersion}" - compile "com.android.support:appcompat-v7:${supportLibVersion}" - compile 'com.github.lecho:hellocharts-library:1.5.8@aar' - compile 'android.arch.persistence.room:runtime:1.0.0' - compile 'junit:junit:4.12' - compile 'android.arch.persistence.room:testing:1.0.0' - compile 'com.android.support.test:runner:1.0.0' - compile 'com.android.support.test:rules:1.0.0' + implementation "com.android.support:design:${supportLibVersion}" + implementation "com.android.support:support-v4:${supportLibVersion}" + implementation "com.android.support:appcompat-v7:${supportLibVersion}" + implementation 'com.github.lecho:hellocharts-library:1.5.8@aar' + implementation 'com.j256.simplecsv:simplecsv:2.2' + implementation 'android.arch.persistence.room:runtime:1.0.0' + implementation 'junit:junit:4.12' + implementation 'android.arch.persistence.room:testing:1.0.0' + implementation 'com.android.support.test:runner:1.0.0' + implementation 'com.android.support.test:rules:1.0.0' annotationProcessor 'android.arch.persistence.room:compiler:1.0.0' } diff --git a/android_app/app/src/main/java/com/health/openscale/core/OpenScale.java b/android_app/app/src/main/java/com/health/openscale/core/OpenScale.java index 045bd29e..8251d3ab 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/OpenScale.java +++ b/android_app/app/src/main/java/com/health/openscale/core/OpenScale.java @@ -40,14 +40,10 @@ import com.health.openscale.core.database.ScaleUserDatabase; import com.health.openscale.core.datatypes.ScaleMeasurement; import com.health.openscale.core.datatypes.ScaleUser; import com.health.openscale.gui.fragments.FragmentUpdateListener; +import com.j256.simplecsv.processor.CsvProcessor; -import java.io.BufferedReader; import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -277,85 +273,34 @@ public class OpenScale { updateScaleData(); } - public void importData(String filename) throws IOException { - File file = new File(filename); - - FileInputStream inputStream = new FileInputStream(file); - - InputStreamReader inputReader = new InputStreamReader(inputStream); - BufferedReader csvReader = new BufferedReader(inputReader); - - String line = csvReader.readLine(); + public void importData(String filename) { + CsvProcessor csvProcessor = new CsvProcessor(ScaleMeasurement.class).withHeaderValidation(true).withFlexibleOrder(true); + File csvFile = new File(filename); try { - while (line != null) { - String csvField[] = line.split(",", -1); - - if (csvField.length < 9) { - throw new IOException("Can't parse CSV file. Field length is wrong."); - } - - ScaleMeasurement newScaleMeasurement = new ScaleMeasurement(); - - newScaleMeasurement.setDateTime(dateTimeFormat.parse(csvField[0])); - newScaleMeasurement.setWeight(Float.parseFloat(csvField[1])); - newScaleMeasurement.setFat(Float.parseFloat(csvField[2])); - newScaleMeasurement.setWater(Float.parseFloat(csvField[3])); - newScaleMeasurement.setMuscle(Float.parseFloat(csvField[4])); - newScaleMeasurement.setLbw(Float.parseFloat(csvField[5])); - newScaleMeasurement.setBone(Float.parseFloat(csvField[6])); - newScaleMeasurement.setWaist(Float.parseFloat(csvField[7])); - newScaleMeasurement.setHip(Float.parseFloat(csvField[8])); - newScaleMeasurement.setComment(csvField[9]); - - newScaleMeasurement.setUserId(getSelectedScaleUser().getId()); - - measurementDAO.insert(newScaleMeasurement); - - line = csvReader.readLine(); - } + List csvScaleMeasurementList = csvProcessor.readAll(csvFile, null); + measurementDAO.insertAll(csvScaleMeasurementList); + updateScaleData(); + Toast.makeText(context, context.getString(R.string.info_data_imported) + " /sdcard" + filename, Toast.LENGTH_SHORT).show(); + } catch (IOException e) { + Toast.makeText(context, context.getString(R.string.error_importing) + e.getMessage(), Toast.LENGTH_SHORT).show(); } catch (ParseException e) { - throw new IOException("Can't parse date format. Please set the date time format as (e.g. 31.10.2014 05:23)"); - } catch (NumberFormatException e) { - throw new IOException("Can't parse float number (" + e.getMessage()+")"); - } catch (ArrayIndexOutOfBoundsException e) { - throw new IOException("Can't parse format column number mismatch"); + Toast.makeText(context, context.getString(R.string.error_importing) + e.getMessage(), Toast.LENGTH_SHORT).show(); } - - updateScaleData(); - - csvReader.close(); - inputReader.close(); } - public void exportData(String filename) throws IOException { - File file = new File(filename); - file.createNewFile(); + public void exportData(String filename) { + CsvProcessor csvProcessor = new CsvProcessor(ScaleMeasurement.class); - FileOutputStream outputStream = new FileOutputStream(file); + File csvFile = new File(filename); - OutputStreamWriter csvWriter = new OutputStreamWriter(outputStream); - - for (ScaleMeasurement scaleMeasurement : scaleMeasurementList) { - csvWriter.append(dateTimeFormat.format(scaleMeasurement.getDateTime()) + ","); - csvWriter.append(Float.toString(scaleMeasurement.getWeight()) + ","); - csvWriter.append(Float.toString(scaleMeasurement.getFat()) + ","); - csvWriter.append(Float.toString(scaleMeasurement.getWater()) + ","); - csvWriter.append(Float.toString(scaleMeasurement.getMuscle()) + ","); - csvWriter.append(Float.toString(scaleMeasurement.getLbw()) + ","); - csvWriter.append(Float.toString(scaleMeasurement.getBone()) + ","); - csvWriter.append(Float.toString(scaleMeasurement.getWaist()) + ","); - csvWriter.append(Float.toString(scaleMeasurement.getHip()) + ","); - if (!scaleMeasurement.getComment().isEmpty()) { - csvWriter.append(scaleMeasurement.getComment()); - } - - csvWriter.append("\n"); + try { + csvProcessor.writeAll(csvFile, scaleMeasurementList, true); + Toast.makeText(context, context.getString(R.string.info_data_exported) + " /sdcard" + filename, Toast.LENGTH_SHORT).show(); + } catch (IOException e) { + Toast.makeText(context, context.getResources().getString(R.string.error_exporting) + " " + e.getMessage(), Toast.LENGTH_SHORT).show(); } - - csvWriter.close(); - outputStream.close(); } public void clearScaleData(int userId) { diff --git a/android_app/app/src/main/java/com/health/openscale/core/datatypes/ScaleMeasurement.java b/android_app/app/src/main/java/com/health/openscale/core/datatypes/ScaleMeasurement.java index 338c59a0..059c5f90 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/datatypes/ScaleMeasurement.java +++ b/android_app/app/src/main/java/com/health/openscale/core/datatypes/ScaleMeasurement.java @@ -21,6 +21,8 @@ import android.arch.persistence.room.Entity; import android.arch.persistence.room.Index; import android.arch.persistence.room.PrimaryKey; +import com.j256.simplecsv.common.CsvColumn; + import java.util.Date; @Entity(tableName = "scaleMeasurements", indices = {@Index(value = {"datetime"}, unique = true)}) @@ -31,28 +33,39 @@ public class ScaleMeasurement { @PrimaryKey(autoGenerate = true) private int id; + @CsvColumn @ColumnInfo(name = "userId") private int userId; @ColumnInfo(name = "enabled") private boolean enabled; + @CsvColumn (format = "dd.MM.yyyy HH:mm") @ColumnInfo(name = "datetime") private Date dateTime; + @CsvColumn @ColumnInfo(name = "weight") private float weight; + @CsvColumn @ColumnInfo(name = "fat") private float fat; + @CsvColumn @ColumnInfo(name = "water") private float water; + @CsvColumn @ColumnInfo(name = "muscle") private float muscle; + @CsvColumn @ColumnInfo(name = "lbw") private float lbw; + @CsvColumn @ColumnInfo(name = "waist") private float waist; + @CsvColumn @ColumnInfo(name = "hip") private float hip; + @CsvColumn @ColumnInfo(name = "bone") private float bone; + @CsvColumn @ColumnInfo(name = "comment") private String comment; diff --git a/android_app/app/src/main/java/com/health/openscale/gui/fragments/TableFragment.java b/android_app/app/src/main/java/com/health/openscale/gui/fragments/TableFragment.java index 67b4378e..18ee4e95 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/fragments/TableFragment.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/fragments/TableFragment.java @@ -42,7 +42,6 @@ import android.widget.ListView; import android.widget.TableLayout; import android.widget.TableRow; import android.widget.TextView; -import android.widget.Toast; import com.health.openscale.R; import com.health.openscale.core.OpenScale; @@ -65,7 +64,6 @@ import com.health.openscale.gui.views.WaistMeasurementView; import com.health.openscale.gui.views.WaterMeasurementView; import com.health.openscale.gui.views.WeightMeasurementView; -import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -290,19 +288,8 @@ public class TableFragment extends Fragment implements FragmentUpdateListener { filenameDialog.setPositiveButton(getResources().getString(R.string.label_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { - boolean isError = false; - - try { - OpenScale.getInstance(getContext()).importData(Environment.getExternalStorageDirectory().getPath() + txtFilename.getText().toString()); - } catch (IOException e) { - Toast.makeText(tableView.getContext(), getResources().getString(R.string.error_importing) + " " + e.getMessage(), Toast.LENGTH_SHORT).show(); - isError = true; - } - - if (!isError) { - Toast.makeText(tableView.getContext(), getResources().getString(R.string.info_data_imported) + " /sdcard" + txtFilename.getText().toString(), Toast.LENGTH_SHORT).show(); - updateOnView(OpenScale.getInstance(getContext()).getScaleMeasurementList()); - } + OpenScale.getInstance(getContext()).importData(Environment.getExternalStorageDirectory().getPath() + txtFilename.getText().toString()); + updateOnView(OpenScale.getInstance(getContext()).getScaleMeasurementList()); } }); @@ -332,18 +319,7 @@ public class TableFragment extends Fragment implements FragmentUpdateListener { filenameDialog.setPositiveButton(getResources().getString(R.string.label_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { - boolean isError = false; - - try { - OpenScale.getInstance(getContext()).exportData(Environment.getExternalStorageDirectory().getPath() + txtFilename.getText().toString()); - } catch (IOException e) { - Toast.makeText(tableView.getContext(), getResources().getString(R.string.error_exporting) + " " + e.getMessage(), Toast.LENGTH_SHORT).show(); - isError = true; - } - - if (!isError) { - Toast.makeText(tableView.getContext(), getResources().getString(R.string.info_data_exported) + " /sdcard" + txtFilename.getText().toString(), Toast.LENGTH_SHORT).show(); - } + OpenScale.getInstance(getContext()).exportData(Environment.getExternalStorageDirectory().getPath() + txtFilename.getText().toString()); } });