package com.betomaluje.miband.sqlite; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.util.Log; import com.betomaluje.miband.DateUtils; import com.betomaluje.miband.models.ActivityData; import com.betomaluje.miband.models.ActivityKind; import java.util.ArrayList; import java.util.Calendar; /** * Created by betomaluje on 7/9/15. */ public class ActivitySQLite { private final String TAG = getClass().getSimpleName(); public static final String TABLE_NAME = "Activities"; private Context context; private static ActivitySQLite instance; public static ActivitySQLite getInstance(Context context) { if (instance == null) instance = new ActivitySQLite(context); return instance; } public ActivitySQLite(Context context) { this.context = context; } public boolean saveActivity(int timestamp, byte provider, short intensity, byte steps, byte type) { MasterSQLiteHelper helperDB = new MasterSQLiteHelper(context); SQLiteDatabase db = helperDB.getWritableDatabase(); //Log.e(TAG, "saving Activity " + timestamp); ContentValues cv = new ContentValues(); cv.put("timestamp", timestamp); cv.put("provider", provider); cv.put("intensity", intensity); cv.put("steps", steps); cv.put("type", type); if (db.insert(TABLE_NAME, null, cv) != -1) { Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(timestamp); Log.e(TAG, "Activity " + DateUtils.convertString(cal) + " insertada con éxito!"); db.close(); return true; } else { db.close(); return false; } } public ArrayList<ActivityData> getSleepSamples(long timestamp_from, long timestamp_to) { return getActivitiesSample(timestamp_from, timestamp_to, ActivityKind.TYPE_SLEEP); } public ArrayList<ActivityData> getActivitySamples(long timestamp_from, long timestamp_to) { return getActivitiesSample(timestamp_from, timestamp_to, ActivityKind.TYPE_ACTIVITY); } public ArrayList<ActivityData> getAllActivitiesSamples(long timestamp_from, long timestamp_to) { return getActivitiesSample(timestamp_from, timestamp_to, ActivityKind.TYPE_ALL); } /** * Returns all available activity samples from between the two timestamps (inclusive), of the given * provided and type(s). * * @param timestamp_from : time in millis from date * @param timestamp_to : time in millis to date * @param activityTypes combination of #TYPE_DEEP_SLEEP, #TYPE_LIGHT_SLEEP, #TYPE_ACTIVITY * @return */ private ArrayList<ActivityData> getActivitiesSample(long timestamp_from, long timestamp_to, int activityTypes) { if (timestamp_to == -1) { timestamp_to = Integer.MAX_VALUE; } MasterSQLiteHelper helperDB = new MasterSQLiteHelper(context); SQLiteDatabase db = helperDB.getReadableDatabase(); ArrayList<ActivityData> allActivities = new ArrayList<ActivityData>(); //Log.i(TAG, "data from " + DateUtils.convertString(timestamp_from) + " to " + DateUtils.convertString(timestamp_to)); String query = "SELECT * FROM " + TABLE_NAME + " WHERE (timestamp>=" + timestamp_from + " AND timestamp<=" + timestamp_to + getWhereClauseFor(activityTypes) + ") ORDER BY timestamp"; Cursor cursor = db.rawQuery(query, null); cursor.moveToFirst(); while (!cursor.isAfterLast()) { allActivities.add(cursorToActivity(cursor)); cursor.moveToNext(); } cursor.close(); db.close(); return allActivities; } public ArrayList<ActivityData> getAllActivities() { MasterSQLiteHelper helperDB = new MasterSQLiteHelper(context); SQLiteDatabase db = helperDB.getReadableDatabase(); ArrayList<ActivityData> allActivities = new ArrayList<ActivityData>(); String query = "SELECT * FROM " + TABLE_NAME + " ORDER BY timestamp"; Cursor cursor = db.rawQuery(query, null); cursor.moveToFirst(); while (!cursor.isAfterLast()) { allActivities.add(cursorToActivity(cursor)); cursor.moveToNext(); } cursor.close(); db.close(); return allActivities; } private String getWhereClauseFor(int activityTypes) { if (activityTypes == ActivityKind.TYPE_ALL) { return ""; // no further restriction } StringBuilder builder = new StringBuilder(" AND ("); byte[] dbActivityTypes = ActivityKind.mapToDBActivityTypes(activityTypes); for (int i = 0; i < dbActivityTypes.length; i++) { builder.append(" type=").append(dbActivityTypes[i]); if (i + 1 < dbActivityTypes.length) { builder.append(" OR "); } } builder.append(')'); return builder.toString(); } private ActivityData cursorToActivity(Cursor cursor) { int timestamp = cursor.getInt(0); byte provider = (byte) cursor.getInt(1); short intensity = (byte) cursor.getInt(2); byte steps = (byte) cursor.getInt(3); byte type = (byte) cursor.getInt(4); return new ActivityData(timestamp, provider, intensity, steps, type); } }