Skip to content

Commit

Permalink
Merge pull request #231 from chaptergy/weight-all-in-one-insert
Browse files Browse the repository at this point in the history
Weight all in one insertion
  • Loading branch information
brodeurlv committed Dec 7, 2021
2 parents 24b519f + 9b62f89 commit 98fba55
Show file tree
Hide file tree
Showing 20 changed files with 920 additions and 691 deletions.
17 changes: 7 additions & 10 deletions app/src/main/java/com/easyfitness/DAO/CVSManager.java
Expand Up @@ -4,7 +4,6 @@
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.icu.util.Output;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
Expand All @@ -18,7 +17,6 @@
import com.easyfitness.DAO.bodymeasures.DAOBodyMeasure;
import com.easyfitness.DAO.bodymeasures.DAOBodyPart;
import com.easyfitness.DAO.cardio.DAOOldCardio;
import com.easyfitness.DAO.program.Program;
import com.easyfitness.DAO.record.DAOCardio;
import com.easyfitness.DAO.record.DAORecord;
import com.easyfitness.DAO.record.Record;
Expand All @@ -27,23 +25,19 @@
import com.easyfitness.enums.Unit;
import com.easyfitness.enums.WeightUnit;
import com.easyfitness.utils.DateConverter;
import com.easyfitness.utils.Value;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PipedOutputStream;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import static android.provider.MediaStore.Downloads.EXTERNAL_CONTENT_URI;


// Uses http://javacsv.sourceforge.net/com/csvreader/CsvReader.html //
Expand Down Expand Up @@ -206,6 +200,7 @@ private boolean exportBodyMeasures(Profile pProfile, String destFolder) {
cvsOutput.write(DAOBodyMeasure.DATE);
cvsOutput.write("bodypart_label");
cvsOutput.write(DAOBodyMeasure.MEASURE);
cvsOutput.write(DAOBodyMeasure.UNIT);
cvsOutput.write(DAOBodyMeasure.PROFIL_KEY);
cvsOutput.write(DAOBodyMeasure.UNIT);
cvsOutput.endRecord();
Expand All @@ -217,7 +212,8 @@ private boolean exportBodyMeasures(Profile pProfile, String destFolder) {
cvsOutput.write(DateConverter.dateToDBDateStr(dateRecord));
BodyPart bp = daoBodyPart.getBodyPart(bodyMeasures.get(i).getBodyPartID());
cvsOutput.write(bp.getName(mContext)); // Write the full name of the BodyPart
cvsOutput.write(Float.toString(bodyMeasures.get(i).getBodyMeasure()));
cvsOutput.write(Float.toString(bodyMeasures.get(i).getBodyMeasure().getValue()));
cvsOutput.write(Integer.toString(bodyMeasures.get(i).getBodyMeasure().getUnit().ordinal()));
cvsOutput.write(Long.toString(bodyMeasures.get(i).getProfileID()));
cvsOutput.write(bodyMeasures.get(i).getUnit().toString());

Expand Down Expand Up @@ -384,12 +380,13 @@ public boolean importDatabase(InputStream file, Profile pProfile) {
break;
}
case DAOProfileWeight.TABLE_NAME: {
// This is the deprecated weight table
DAOBodyMeasure dbcWeight = new DAOBodyMeasure(mContext);
dbcWeight.open();
Date date = DateConverter.DBDateStrToDate(csvRecords.get(DAOProfileWeight.DATE));

float poids = Float.parseFloat(csvRecords.get(DAOProfileWeight.POIDS));
dbcWeight.addBodyMeasure(date, BodyPartExtensions.WEIGHT, poids, pProfile.getId(), Unit.KG);
dbcWeight.addBodyMeasure(date, BodyPartExtensions.WEIGHT, new Value(poids, Unit.KG), pProfile.getId());

break;
}
Expand All @@ -405,7 +402,7 @@ public boolean importDatabase(InputStream file, Profile pProfile) {
for (BodyPart bp : bodyParts) {
if (bp.getName(mContext).equals(bodyPartName)) {
float measure = Float.parseFloat(csvRecords.get(DAOBodyMeasure.MEASURE));
dbcBodyMeasure.addBodyMeasure(date, bp.getId(), measure, pProfile.getId(), unit);
dbcBodyMeasure.addBodyMeasure(date, bp.getId(), new Value(measure, unit), pProfile.getId());
dbcBodyPart.close();
break;
}
Expand Down
15 changes: 10 additions & 5 deletions app/src/main/java/com/easyfitness/DAO/DatabaseHelper.java
Expand Up @@ -24,6 +24,7 @@
import com.easyfitness.enums.Muscle;
import com.easyfitness.enums.Unit;
import com.easyfitness.utils.DateConverter;
import com.easyfitness.utils.Value;

import java.io.File;
import java.util.ArrayList;
Expand Down Expand Up @@ -145,7 +146,6 @@ public void onUpgrade(
db.execSQL("ALTER TABLE " + DAORecord.TABLE_NAME + " ADD COLUMN " + DAORecord.EXERCISE_TYPE + " INTEGER DEFAULT " + ExerciseType.STRENGTH.ordinal());
break;
case 16:
// Merge of Cardio DB and Fonte DB
db.execSQL("ALTER TABLE " + DAOBodyMeasure.TABLE_NAME + " ADD COLUMN " + DAOBodyMeasure.UNIT + " INTEGER");
migrateWeightTable(db);
break;
Expand Down Expand Up @@ -196,11 +196,12 @@ public void onUpgrade(

List<Profile> profileList = daoProfile.getAllProfiles(db);
for (Profile profile:profileList) {
daoBodyMeasure.addBodyMeasure(db, DateConverter.getNewDate(), sizeBodyPartId, profile.getSize(), profile.getId(), defaultSizeUnit);
daoBodyMeasure.addBodyMeasure(db, DateConverter.getNewDate(), sizeBodyPartId, new Value((float) profile.getSize(), defaultSizeUnit), profile.getId());
}
break;
case 24:
updateMusclesToUseNewIds(db);
break;
}
upgradeTo++;
}
Expand Down Expand Up @@ -293,6 +294,7 @@ private void migrateWeightTable(SQLiteDatabase db) {
value.put(DAOBodyMeasure.DATE, mCursor.getString(mCursor.getColumnIndex(DAOProfileWeight.DATE)));
value.put(DAOBodyMeasure.BODYPART_ID, BodyPartExtensions.WEIGHT);
value.put(DAOBodyMeasure.MEASURE, mCursor.getFloat(mCursor.getColumnIndex(DAOProfileWeight.POIDS)));
value.put(DAOBodyMeasure.UNIT, Unit.KG.ordinal());
value.put(DAOBodyMeasure.PROFIL_KEY, mCursor.getLong(mCursor.getColumnIndex(DAOProfileWeight.PROFIL_KEY)));

db.insert(DAOBodyMeasure.TABLE_NAME, null, value);
Expand All @@ -308,6 +310,8 @@ private void upgradeBodyMeasureUnits(SQLiteDatabase db) {
List<BodyMeasure> valueList = daoBodyMeasure.getMeasuresList(db, selectQuery);

for (BodyMeasure bodyMeasure : valueList) {
Value oldValue = bodyMeasure.getBodyMeasure();
Value newValue = oldValue;
switch (bodyMeasure.getBodyPartID()) {
case BodyPartExtensions.LEFTBICEPS:
case BodyPartExtensions.RIGHTBICEPS:
Expand All @@ -318,17 +322,18 @@ private void upgradeBodyMeasureUnits(SQLiteDatabase db) {
case BodyPartExtensions.RIGHTTHIGH:
case BodyPartExtensions.LEFTCALVES:
case BodyPartExtensions.RIGHTCALVES:
bodyMeasure.setUnit(Unit.CM);
newValue = new Value(oldValue.getValue(), Unit.CM);
break;
case BodyPartExtensions.WEIGHT:
bodyMeasure.setUnit(Unit.KG);
newValue = new Value(oldValue.getValue(), Unit.KG);
break;
case BodyPartExtensions.MUSCLES:
case BodyPartExtensions.WATER:
case BodyPartExtensions.FAT:
bodyMeasure.setUnit(Unit.PERCENTAGE);
newValue = new Value(oldValue.getValue(), Unit.PERCENTAGE);
break;
}
bodyMeasure.setBodyMeasure(newValue);
daoBodyMeasure.updateMeasure(db, bodyMeasure);
}
}
Expand Down
@@ -1,6 +1,7 @@
package com.easyfitness.DAO.bodymeasures;

import com.easyfitness.enums.Unit;
import com.easyfitness.utils.Value;

import java.util.Date;

Expand All @@ -11,18 +12,16 @@ public class BodyMeasure {
private final long mProfil_id;
// Notez que l'identifiant est un long
private long mId;
private float mMeasure;
private Unit mUnit;
private Value mMeasure;
private String mTime;

public BodyMeasure(long id, Date pDate, int pBodypart_id, float pMeasure, long pProfil_id, Unit pUnit) {
public BodyMeasure(long id, Date pDate, int pBodypart_id, Value pMeasure, long pProfil_id) {
super();
mId = id;
mDate = pDate;
mBodypart_id = pBodypart_id;
mMeasure = pMeasure;
mProfil_id = pProfil_id;
mUnit = pUnit;
}

public long getId() {
Expand All @@ -45,24 +44,16 @@ public int getBodyPartID() {
return mBodypart_id;
}

public float getBodyMeasure() {
public Value getBodyMeasure() {
return mMeasure;
}

public void setBodyMeasure(float bodyMeasure) {
public void setBodyMeasure(Value bodyMeasure) {
mMeasure = bodyMeasure;
}

public long getProfileID() {
return mProfil_id;
}

public Unit getUnit() {
return mUnit;
}

public void setUnit(Unit unit) {
mUnit = unit;
}

}
Expand Up @@ -5,10 +5,13 @@
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import androidx.core.content.res.ResourcesCompat;

import com.easyfitness.DAO.DAOBase;
import com.easyfitness.DAO.Profile;
import com.easyfitness.enums.Unit;
import com.easyfitness.utils.DateConverter;
import com.easyfitness.utils.Value;

import java.util.ArrayList;
import java.util.Date;
Expand All @@ -26,7 +29,7 @@ public class DAOBodyMeasure extends DAOBase {
public static final String UNIT = "unit";
public static final String PROFIL_KEY = "profil_id";

public static final String TABLE_CREATE = "CREATE TABLE " + TABLE_NAME + " (" + KEY + " INTEGER PRIMARY KEY AUTOINCREMENT, " + DATE + " DATE, " + BODYPART_ID + " INTEGER, " + MEASURE + " REAL , " + PROFIL_KEY + " INTEGER, " + UNIT + " INTEGER);";
public static final String TABLE_CREATE = "CREATE TABLE " + TABLE_NAME + " (" + KEY + " INTEGER PRIMARY KEY AUTOINCREMENT, " + DATE + " DATE, " + BODYPART_ID + " INTEGER, " + MEASURE + " REAL , " + PROFIL_KEY + " INTEGER, " + UNIT + " INTEGER);";

public static final String TABLE_DROP = "DROP TABLE IF EXISTS " + TABLE_NAME + ";";
private final Profile mProfile = null;
Expand All @@ -39,22 +42,22 @@ public DAOBodyMeasure(Context context) {
/**
* @param pDate date of the weight measure
* @param pBodyPartId id of the body part
* @param pMeasure body measure
* @param pValue body measure
* @param pProfileId profil associated with the measure
*/
public void addBodyMeasure(Date pDate, long pBodyPartId, float pMeasure, long pProfileId, Unit pUnit) {
public void addBodyMeasure(Date pDate, long pBodyPartId, Value pValue, long pProfileId) {
SQLiteDatabase db = this.getWritableDatabase();
addBodyMeasure(db, pDate, pBodyPartId, pMeasure, pProfileId, pUnit);
addBodyMeasure(db, pDate, pBodyPartId, pValue, pProfileId);
}

/**
* @param db database
* @param pDate date of the weight measure
* @param pBodyPartId id of the body part
* @param pMeasure body measure
* @param pValue body measure
* @param pProfileId profil associated with the measure
*/
public void addBodyMeasure(SQLiteDatabase db, Date pDate, long pBodyPartId, float pMeasure, long pProfileId, Unit pUnit) {
public void addBodyMeasure(SQLiteDatabase db, Date pDate, long pBodyPartId, Value pValue, long pProfileId) {
ContentValues value = new ContentValues();

// Only one measure pr day, so if one already existing, updates it.
Expand All @@ -64,15 +67,14 @@ public void addBodyMeasure(SQLiteDatabase db, Date pDate, long pBodyPartId, floa
String dateString = DateConverter.dateToDBDateStr(pDate);
value.put(DAOBodyMeasure.DATE, dateString);
value.put(DAOBodyMeasure.BODYPART_ID, pBodyPartId);
value.put(DAOBodyMeasure.MEASURE, pMeasure);
value.put(DAOBodyMeasure.MEASURE, pValue.getValue());
value.put(DAOBodyMeasure.PROFIL_KEY, pProfileId);
value.put(DAOBodyMeasure.UNIT, pUnit.ordinal());
value.put(DAOBodyMeasure.UNIT, pValue.getUnit().ordinal());

db.insert(DAOBodyMeasure.TABLE_NAME, null, value);

} else {
existingBodyMeasure.setBodyMeasure(pMeasure);
existingBodyMeasure.setUnit(pUnit);
existingBodyMeasure.setBodyMeasure(pValue);

updateMeasure(db, existingBodyMeasure);
}
Expand All @@ -95,18 +97,22 @@ public BodyMeasure getMeasure(long id) {

Date date = DateConverter.DBDateStrToDate(mCursor.getString(mCursor.getColumnIndex(DATE)));

BodyMeasure value = new BodyMeasure(mCursor.getLong(mCursor.getColumnIndex(KEY)),
date,
mCursor.getInt(mCursor.getColumnIndex(BODYPART_ID)),
Value value = new Value(
mCursor.getFloat(mCursor.getColumnIndex(MEASURE)),
mCursor.getLong(mCursor.getColumnIndex(PROFIL_KEY)),
Unit.fromInteger(mCursor.getInt(mCursor.getColumnIndex(UNIT)))
Unit.fromInteger(mCursor.getInt(mCursor.getColumnIndex(UNIT))),
null,
ResourcesCompat.ID_NULL
);

//db.close();

// return value
return value;
return new BodyMeasure(mCursor.getLong(mCursor.getColumnIndex(KEY)),
date,
mCursor.getInt(mCursor.getColumnIndex(BODYPART_ID)),
value,
mCursor.getLong(mCursor.getColumnIndex(PROFIL_KEY))
);
}

// Getting All Measures
Expand All @@ -122,16 +128,22 @@ public List<BodyMeasure> getMeasuresList(SQLiteDatabase db, String pRequest) {
do {
Date date = DateConverter.DBDateStrToDate(mCursor.getString(mCursor.getColumnIndex(DATE)));

BodyMeasure value = new BodyMeasure(mCursor.getLong(mCursor.getColumnIndex(KEY)),
Value value = new Value(
mCursor.getFloat(mCursor.getColumnIndex(MEASURE)),
Unit.fromInteger(mCursor.getInt(mCursor.getColumnIndex(UNIT))),
null,
ResourcesCompat.ID_NULL
);

BodyMeasure measure = new BodyMeasure(mCursor.getLong(mCursor.getColumnIndex(KEY)),
date,
mCursor.getInt(mCursor.getColumnIndex(BODYPART_ID)),
mCursor.getFloat(mCursor.getColumnIndex(MEASURE)),
mCursor.getLong(mCursor.getColumnIndex(PROFIL_KEY)),
Unit.fromInteger(mCursor.getInt(mCursor.getColumnIndex(UNIT)))
value,
mCursor.getLong(mCursor.getColumnIndex(PROFIL_KEY))
);

// Adding value to list
valueList.add(value);
valueList.add(measure);
} while (mCursor.moveToNext());
}

Expand Down Expand Up @@ -194,45 +206,43 @@ public List<BodyMeasure> getAllBodyMeasures() {
}

/**
* Getting All Measures associated to a Body part for a specific Profile
* Getting the latest measures associated to a Body part for a specific Profile
*
* @param pBodyPartID
* @param pProfile
* @return List<BodyMeasure>
*/
public BodyMeasure getLastBodyMeasures(long pBodyPartID, Profile pProfile) {
// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_NAME + " WHERE " + BODYPART_ID + "=" + pBodyPartID + " AND " + PROFIL_KEY + "=" + pProfile.getId() + " ORDER BY date(" + DATE + ") DESC";
String selectQuery = "SELECT * FROM " + TABLE_NAME + " WHERE " + BODYPART_ID + "=" + pBodyPartID + " AND " + PROFIL_KEY + "=" + pProfile.getId() + " ORDER BY date(" + DATE + ") DESC LIMIT 1";

List<BodyMeasure> array = getMeasuresList(getReadableDatabase(), selectQuery);
if (array.size() <= 0) {
return null;
}

// return value list
return getMeasuresList(getReadableDatabase(), selectQuery).get(0);
return array.get(0);
}

/**
* Getting All Measures associated to a Body part for a specific Profile
* Getting the measure associated to a Body part for a specific Profile on a specific date
*
* @param pBodyPartID
* @param pProfileId
* @return List<BodyMeasure>
*/
public BodyMeasure getBodyMeasuresFromDate(SQLiteDatabase db, long pBodyPartID, Date pDate, long pProfileId) {
String dateString = DateConverter.dateToDBDateStr(pDate);

// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_NAME + " WHERE " + BODYPART_ID + "=" + pBodyPartID + " AND " + DATE + "=\"" + dateString + "\" AND " + PROFIL_KEY + "=" + pProfileId + " ORDER BY date(" + DATE + ") DESC";
String selectQuery = "SELECT * FROM " + TABLE_NAME + " WHERE " + BODYPART_ID + "=" + pBodyPartID + " AND " + DATE + "=\"" + dateString + "\" AND " + PROFIL_KEY + "=" + pProfileId + " ORDER BY date(" + DATE + ") DESC LIMIT 1";

List<BodyMeasure> array = getMeasuresList(db, selectQuery);
if (array.size() <= 0) {
return null;
}

// return value list
return getMeasuresList(getReadableDatabase(), selectQuery).get(0);
return array.get(0);
}

// Updating single value
Expand All @@ -246,9 +256,9 @@ public int updateMeasure(SQLiteDatabase db, BodyMeasure m) {
String dateString = DateConverter.dateToDBDateStr(m.getDate());
value.put(DAOBodyMeasure.DATE, dateString);
value.put(DAOBodyMeasure.BODYPART_ID, m.getBodyPartID());
value.put(DAOBodyMeasure.MEASURE, m.getBodyMeasure());
value.put(DAOBodyMeasure.MEASURE, m.getBodyMeasure().getValue());
value.put(DAOBodyMeasure.PROFIL_KEY, m.getProfileID());
value.put(DAOBodyMeasure.UNIT, m.getUnit().ordinal());
value.put(DAOBodyMeasure.UNIT, m.getBodyMeasure().getUnit().ordinal());

// updating row
return db.update(TABLE_NAME, value, KEY + " = ?",
Expand Down

0 comments on commit 98fba55

Please sign in to comment.