Project: AirCastingAndroidClient
package pl.llp.aircasting.repository;
 
import pl.llp.aircasting.helper.NoOp; 
import pl.llp.aircasting.model.Measurement; 
import pl.llp.aircasting.model.Session; 
import pl.llp.aircasting.util.Constants; 
 
import android.content.ContentValues; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.util.Log; 
import org.intellij.lang.annotations.Language; 
 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Map; 
 
import static com.google.common.collect.Maps.newHashMap; 
import static pl.llp.aircasting.repository.DBHelper.getDate; 
import static pl.llp.aircasting.repository.DBHelper.getDouble; 
import static pl.llp.aircasting.repository.DBHelper.getLong; 
import static pl.llp.aircasting.repository.db.DBConstants.*; 
 
  private ProgressListener progress = NoOp.progressListener(); 
 
  @Language("SQL"
  private static final String INSERT_MEASUREMENTS = "" + 
      "INSERT INTO " + MEASUREMENT_TABLE_NAME + "(" + 
      MEASUREMENT_STREAM_ID + ", " + 
      MEASUREMENT_SESSION_ID + ", " + 
      MEASUREMENT_TIME + ", " + 
      MEASUREMENT_LATITUDE + ", " + 
      MEASUREMENT_LONGITUDE + ", " + 
      MEASUREMENT_VALUE + ") " + 
      " VALUES(?, ?, ?, ?, ?, ?)"
 
 
  public MeasurementRepository(ProgressListener progressListener) 
  { 
    if(progressListener != null
    { 
      progress = progressListener; 
    } 
  } 
 
  @Internal 
  Map<Long, List<Measurement>> load(Session session, SQLiteDatabase readableDatabase) 
  { 
    Cursor measurements = readableDatabase.rawQuery("" + 
                    "SELECT * FROM " + MEASUREMENT_TABLE_NAME + " " + 
                    "WHERE " + MEASUREMENT_SESSION_ID  +" = " + session.getId(), null); 
 
    progress.onSizeCalculated(measurements.getCount()); 
 
    measurements.moveToFirst(); 
    Map<Long, List<Measurement>> results = newHashMap(); 
    while(!measurements.isAfterLast()) 
    { 
      Measurement measurement = new Measurement(); 
      measurement.setLatitude(getDouble(measurements, MEASUREMENT_LATITUDE)); 
      measurement.setLongitude(getDouble(measurements, MEASUREMENT_LONGITUDE)); 
      measurement.setValue(getDouble(measurements, MEASUREMENT_VALUE)); 
      measurement.setTime(getDate(measurements, MEASUREMENT_TIME)); 
 
      long id = getLong(measurements, MEASUREMENT_STREAM_ID); 
      stream(id, results).add(measurement); 
 
      int position = measurements.getPosition(); 
      if(position % 100 == 0
      { 
        progress.onProgress(position); 
      } 
      measurements.moveToNext(); 
    } 
    measurements.close(); 
 
    return results; 
  } 
 
  private List<Measurement> stream(long id, Map<Long, List<Measurement>> results) 
  { 
    if(!results.containsKey(id)) 
    { 
      results.put(id, new ArrayList<Measurement>()); 
    } 
    return results.get(id); 
  } 
 
  @Internal 
  void save(List<Measurement> measurementsToSave, long sessionId, long streamId, SQLiteDatabase writableDatabase) 
  { 
    ContentValues values = new ContentValues(6); 
    values.put(MEASUREMENT_SESSION_ID, sessionId); 
    values.put(MEASUREMENT_STREAM_ID, streamId); 
 
    for (Measurement measurement : measurementsToSave) 
    { 
      values.put(MEASUREMENT_LONGITUDE, measurement.getLongitude()); 
      values.put(MEASUREMENT_LATITUDE, measurement.getLatitude()); 
      values.put(MEASUREMENT_VALUE, measurement.getValue()); 
      values.put(MEASUREMENT_TIME, measurement.getTime().getTime()); 
 
      writableDatabase.insertOrThrow(MEASUREMENT_TABLE_NAME, null, values); 
    } 
  } 
 
  @Internal 
  void deleteAllFrom(Long streamId, SQLiteDatabase writableDatabase) 
  { 
    try 
    { 
      writableDatabase.delete(MEASUREMENT_TABLE_NAME, MEASUREMENT_STREAM_ID + " = " + streamId, null); 
    } 
    catch (SQLException e) 
    { 
      Log.e(Constants.TAG, "Error removing measurements from stream [" + streamId + "]", e); 
    } 
  } 
}