/* * Copyright (C) 2014 Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.android.wearable.speedtracker.db; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.provider.BaseColumns; import android.util.Log; import com.example.android.wearable.speedtracker.common.LocationEntry; import com.example.android.wearable.speedtracker.common.Utils; import java.util.ArrayList; import java.util.Calendar; import java.util.List; /** * A helper class to set up the database that holds the GPS location information */ public class LocationDbHelper extends SQLiteOpenHelper { private static final String TAG = "LocationDbHelper"; public static final String TABLE_NAME = "location"; public static final String COLUMN_NAME_DAY = "day"; public static final String COLUMN_NAME_LATITUDE = "lat"; public static final String COLUMN_NAME_LONGITUDE = "lon"; public static final String COLUMN_NAME_TIME = "time"; private static final String TEXT_TYPE = " TEXT"; private static final String INTEGER_TYPE = " INTEGER"; private static final String REAL_TYPE = " REAL"; private static final String COMMA_SEP = ","; private static final String SQL_CREATE_ENTRIES = "CREATE TABLE " + TABLE_NAME + " (" + BaseColumns._ID + " INTEGER PRIMARY KEY," + COLUMN_NAME_DAY + TEXT_TYPE + COMMA_SEP + COLUMN_NAME_LATITUDE + REAL_TYPE + COMMA_SEP + COLUMN_NAME_LONGITUDE + REAL_TYPE + COMMA_SEP + COLUMN_NAME_TIME + INTEGER_TYPE + " )"; private static final String SQL_DELETE_ENTRIES = "DROP TABLE IF EXISTS " + TABLE_NAME; public static final int DATABASE_VERSION = 1; public static final String DATABASE_NAME = "Location.db"; public LocationDbHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(SQL_CREATE_ENTRIES); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL(SQL_DELETE_ENTRIES); onCreate(db); } /** * Inserts a {@link com.example.android.wearable.speedtracker.common.LocationEntry} item to the * database. */ public final long insert(LocationEntry entry) { if (Log.isLoggable(TAG, Log.DEBUG)) { Log.d(TAG, "Inserting a LocationEntry"); } // Gets the data repository in write mode SQLiteDatabase db = getWritableDatabase(); // Create a new map of values, where column names are the keys ContentValues values = new ContentValues(); values.put(COLUMN_NAME_DAY, entry.day); values.put(COLUMN_NAME_LONGITUDE, entry.longitude); values.put(COLUMN_NAME_LATITUDE, entry.latitude); values.put(COLUMN_NAME_TIME, entry.calendar.getTimeInMillis()); // Insert the new row, returning the primary key value of the new row return db.insert(TABLE_NAME, "null", values); } /** * Returns a list of {@link com.example.android.wearable.speedtracker.common.LocationEntry} * objects from the database for a given day. The list can be empty (but not {@code null}) if * there are no such items. This method looks at the day that the calendar argument points at. */ public final List read(Calendar calendar) { SQLiteDatabase db = getReadableDatabase(); String[] projection = { COLUMN_NAME_LONGITUDE, COLUMN_NAME_LATITUDE, COLUMN_NAME_TIME }; String day = Utils.getHashedDay(calendar); // sort ASC based on the time of the entry String sortOrder = COLUMN_NAME_TIME + " ASC"; String selection = COLUMN_NAME_DAY + " LIKE ?"; Cursor cursor = db.query( TABLE_NAME, // The table to query projection, // The columns to return selection, // The columns for the WHERE clause new String[]{day}, // The values for the WHERE clause null, // don't group the rows null, // don't filter by row groups sortOrder // The sort order ); List result = new ArrayList(); int count = cursor.getCount(); if (count > 0) { cursor.moveToFirst(); while (!cursor.isAfterLast()) { Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(cursor.getLong(2)); LocationEntry entry = new LocationEntry(cal, cursor.getDouble(1), cursor.getDouble(0)); result.add(entry); cursor.moveToNext(); } } cursor.close(); return result; } /** * Deletes all the entries in the database for the given day. The argument {@code day} should * match the format provided by {@link getHashedDay()} */ public final int delete(String day) { SQLiteDatabase db = getWritableDatabase(); // Define 'where' part of the query. String selection = COLUMN_NAME_DAY + " LIKE ?"; String[] selectionArgs = {day}; return db.delete(TABLE_NAME, selection, selectionArgs); } /** * Deletes all the entries in the database for the day that the {@link java.util.Calendar} * argument points at. */ public final int delete(Calendar calendar) { return delete(Utils.getHashedDay(calendar)); } }