1
0
mirror of https://github.com/oliexdev/openScale.git synced 2025-08-27 02:05:26 +02:00

Replaced CSV export/import function with SimpleCSV library source code

This commit is contained in:
OliE
2018-01-05 18:35:14 +01:00
parent 49a69f1ebc
commit 3432bbf21d
4 changed files with 45 additions and 110 deletions

View File

@@ -37,15 +37,16 @@ ext {
} }
dependencies { dependencies {
compile "com.android.support:design:${supportLibVersion}" implementation "com.android.support:design:${supportLibVersion}"
compile "com.android.support:support-v4:${supportLibVersion}" implementation "com.android.support:support-v4:${supportLibVersion}"
compile "com.android.support:appcompat-v7:${supportLibVersion}" implementation "com.android.support:appcompat-v7:${supportLibVersion}"
compile 'com.github.lecho:hellocharts-library:1.5.8@aar' implementation 'com.github.lecho:hellocharts-library:1.5.8@aar'
compile 'android.arch.persistence.room:runtime:1.0.0' implementation 'com.j256.simplecsv:simplecsv:2.2'
compile 'junit:junit:4.12' implementation 'android.arch.persistence.room:runtime:1.0.0'
compile 'android.arch.persistence.room:testing:1.0.0' implementation 'junit:junit:4.12'
compile 'com.android.support.test:runner:1.0.0' implementation 'android.arch.persistence.room:testing:1.0.0'
compile 'com.android.support.test:rules: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' annotationProcessor 'android.arch.persistence.room:compiler:1.0.0'
} }

View File

@@ -40,14 +40,10 @@ import com.health.openscale.core.database.ScaleUserDatabase;
import com.health.openscale.core.datatypes.ScaleMeasurement; import com.health.openscale.core.datatypes.ScaleMeasurement;
import com.health.openscale.core.datatypes.ScaleUser; import com.health.openscale.core.datatypes.ScaleUser;
import com.health.openscale.gui.fragments.FragmentUpdateListener; import com.health.openscale.gui.fragments.FragmentUpdateListener;
import com.j256.simplecsv.processor.CsvProcessor;
import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
@@ -277,85 +273,34 @@ public class OpenScale {
updateScaleData(); updateScaleData();
} }
public void importData(String filename) throws IOException { public void importData(String filename) {
File file = new File(filename); CsvProcessor<ScaleMeasurement> csvProcessor = new CsvProcessor<ScaleMeasurement>(ScaleMeasurement.class).withHeaderValidation(true).withFlexibleOrder(true);
File csvFile = new File(filename);
FileInputStream inputStream = new FileInputStream(file);
InputStreamReader inputReader = new InputStreamReader(inputStream);
BufferedReader csvReader = new BufferedReader(inputReader);
String line = csvReader.readLine();
try { try {
while (line != null) { List<ScaleMeasurement> csvScaleMeasurementList = csvProcessor.readAll(csvFile, 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();
}
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) { } catch (ParseException e) {
throw new IOException("Can't parse date format. Please set the date time format as <dd.MM.yyyy HH:mm> (e.g. 31.10.2014 05:23)"); Toast.makeText(context, context.getString(R.string.error_importing) + e.getMessage(), Toast.LENGTH_SHORT).show();
} 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");
} }
updateScaleData();
csvReader.close();
inputReader.close();
} }
public void exportData(String filename) throws IOException { public void exportData(String filename) {
File file = new File(filename); CsvProcessor<ScaleMeasurement> csvProcessor = new CsvProcessor<ScaleMeasurement>(ScaleMeasurement.class);
file.createNewFile();
FileOutputStream outputStream = new FileOutputStream(file); File csvFile = new File(filename);
OutputStreamWriter csvWriter = new OutputStreamWriter(outputStream); try {
csvProcessor.writeAll(csvFile, scaleMeasurementList, true);
for (ScaleMeasurement scaleMeasurement : scaleMeasurementList) { Toast.makeText(context, context.getString(R.string.info_data_exported) + " /sdcard" + filename, Toast.LENGTH_SHORT).show();
csvWriter.append(dateTimeFormat.format(scaleMeasurement.getDateTime()) + ","); } catch (IOException e) {
csvWriter.append(Float.toString(scaleMeasurement.getWeight()) + ","); Toast.makeText(context, context.getResources().getString(R.string.error_exporting) + " " + e.getMessage(), Toast.LENGTH_SHORT).show();
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");
} }
csvWriter.close();
outputStream.close();
} }
public void clearScaleData(int userId) { public void clearScaleData(int userId) {

View File

@@ -21,6 +21,8 @@ import android.arch.persistence.room.Entity;
import android.arch.persistence.room.Index; import android.arch.persistence.room.Index;
import android.arch.persistence.room.PrimaryKey; import android.arch.persistence.room.PrimaryKey;
import com.j256.simplecsv.common.CsvColumn;
import java.util.Date; import java.util.Date;
@Entity(tableName = "scaleMeasurements", indices = {@Index(value = {"datetime"}, unique = true)}) @Entity(tableName = "scaleMeasurements", indices = {@Index(value = {"datetime"}, unique = true)})
@@ -31,28 +33,39 @@ public class ScaleMeasurement {
@PrimaryKey(autoGenerate = true) @PrimaryKey(autoGenerate = true)
private int id; private int id;
@CsvColumn
@ColumnInfo(name = "userId") @ColumnInfo(name = "userId")
private int userId; private int userId;
@ColumnInfo(name = "enabled") @ColumnInfo(name = "enabled")
private boolean enabled; private boolean enabled;
@CsvColumn (format = "dd.MM.yyyy HH:mm")
@ColumnInfo(name = "datetime") @ColumnInfo(name = "datetime")
private Date dateTime; private Date dateTime;
@CsvColumn
@ColumnInfo(name = "weight") @ColumnInfo(name = "weight")
private float weight; private float weight;
@CsvColumn
@ColumnInfo(name = "fat") @ColumnInfo(name = "fat")
private float fat; private float fat;
@CsvColumn
@ColumnInfo(name = "water") @ColumnInfo(name = "water")
private float water; private float water;
@CsvColumn
@ColumnInfo(name = "muscle") @ColumnInfo(name = "muscle")
private float muscle; private float muscle;
@CsvColumn
@ColumnInfo(name = "lbw") @ColumnInfo(name = "lbw")
private float lbw; private float lbw;
@CsvColumn
@ColumnInfo(name = "waist") @ColumnInfo(name = "waist")
private float waist; private float waist;
@CsvColumn
@ColumnInfo(name = "hip") @ColumnInfo(name = "hip")
private float hip; private float hip;
@CsvColumn
@ColumnInfo(name = "bone") @ColumnInfo(name = "bone")
private float bone; private float bone;
@CsvColumn
@ColumnInfo(name = "comment") @ColumnInfo(name = "comment")
private String comment; private String comment;

View File

@@ -42,7 +42,6 @@ import android.widget.ListView;
import android.widget.TableLayout; import android.widget.TableLayout;
import android.widget.TableRow; import android.widget.TableRow;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast;
import com.health.openscale.R; import com.health.openscale.R;
import com.health.openscale.core.OpenScale; 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.WaterMeasurementView;
import com.health.openscale.gui.views.WeightMeasurementView; import com.health.openscale.gui.views.WeightMeasurementView;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; 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() { filenameDialog.setPositiveButton(getResources().getString(R.string.label_ok), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) { public void onClick(DialogInterface dialog, int id) {
boolean isError = false; OpenScale.getInstance(getContext()).importData(Environment.getExternalStorageDirectory().getPath() + txtFilename.getText().toString());
updateOnView(OpenScale.getInstance(getContext()).getScaleMeasurementList());
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());
}
} }
}); });
@@ -332,18 +319,7 @@ public class TableFragment extends Fragment implements FragmentUpdateListener {
filenameDialog.setPositiveButton(getResources().getString(R.string.label_ok), new DialogInterface.OnClickListener() { filenameDialog.setPositiveButton(getResources().getString(R.string.label_ok), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) { public void onClick(DialogInterface dialog, int id) {
boolean isError = false; OpenScale.getInstance(getContext()).exportData(Environment.getExternalStorageDirectory().getPath() + txtFilename.getText().toString());
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();
}
} }
}); });