package de.avalax.fitbuddy.port.adapter.persistence; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import java.util.ArrayList; import java.util.List; import de.avalax.fitbuddy.domain.model.exercise.BasicExercise; import de.avalax.fitbuddy.domain.model.exercise.Exercise; import de.avalax.fitbuddy.domain.model.exercise.ExerciseId; import de.avalax.fitbuddy.domain.model.exercise.ExerciseRepository; import de.avalax.fitbuddy.domain.model.set.Set; import de.avalax.fitbuddy.domain.model.set.SetRepository; import de.avalax.fitbuddy.domain.model.workout.WorkoutId; public class SQLiteExerciseRepository implements ExerciseRepository { private static final String TABLE_EXERCISE = "exercise"; private SQLiteOpenHelper sqLiteOpenHelper; private SetRepository setRepository; public SQLiteExerciseRepository( SQLiteOpenHelper sqLiteOpenHelper, SetRepository setRepository) { this.sqLiteOpenHelper = sqLiteOpenHelper; this.setRepository = setRepository; } @Override public void delete(ExerciseId exerciseId) { if (exerciseId == null) { return; } SQLiteDatabase database = sqLiteOpenHelper.getWritableDatabase(); database.delete(TABLE_EXERCISE, "id=?", new String[]{exerciseId.getId()}); database.close(); } @Override public List<Exercise> allExercisesBelongsTo(WorkoutId workoutId) { List<Exercise> exercises = new ArrayList<>(); SQLiteDatabase database = sqLiteOpenHelper.getReadableDatabase(); Cursor cursor = database.query(TABLE_EXERCISE, new String[]{"id", "name"}, "workout_id=?", new String[]{workoutId.getId()}, null, null, "position"); if (cursor.moveToFirst()) { do { ExerciseId exerciseId = new ExerciseId(cursor.getString(0)); List<Set> sets = setRepository.allSetsBelongsTo(exerciseId); Exercise exercise = new BasicExercise(exerciseId, cursor.getString(1), sets); exercises.add(exercise); } while (cursor.moveToNext()); } cursor.close(); database.close(); return exercises; } @Override public void save(WorkoutId workoutId, int position, Exercise exercise) { SQLiteDatabase database = sqLiteOpenHelper.getWritableDatabase(); ContentValues contentValues = getContentValues(workoutId, position, exercise); if (exercise.getExerciseId() == null) { long id = database.insertOrThrow(TABLE_EXERCISE, null, contentValues); ExerciseId exerciseId = new ExerciseId(String.valueOf(id)); exercise.setExerciseId(exerciseId); } else { String[] args = {exercise.getExerciseId().getId()}; database.update(TABLE_EXERCISE, contentValues, "id=?", args); } database.close(); for (Set set : exercise.getSets()) { setRepository.save(exercise.getExerciseId(), set); } } private ContentValues getContentValues(WorkoutId workoutId, int position, Exercise exercise) { ContentValues values = new ContentValues(); values.put("workout_id", workoutId.getId()); values.put("name", exercise.getName()); values.put("position", position); return values; } }