/*
* Copyright 2011 Austin Wagner
*
* This file is part of Mobile Shuttle Tracker.
*
* Mobile Shuttle Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Mobile Shuttle Tracker is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Mobile Shuttle Tracker. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.abstractedsheep.shuttletracker.sql;
import java.util.ArrayList;
import java.util.List;
import com.abstractedsheep.shuttletracker.FavoriteStop;
import com.abstractedsheep.shuttletrackerworld.Netlink;
import com.abstractedsheep.shuttletrackerworld.Netlink.RouteJson;
import com.abstractedsheep.shuttletrackerworld.Netlink.StopJson;
import com.abstractedsheep.shuttletrackerworld.Netlink.RouteJson.RouteCoordinateJson;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String dbName="trackerDB";
public static class StopsTable {
public static final String tableName="Stops";
public static final String colId="id";
public static final String colName="name";
public static final String colLat="latitude";
public static final String colLon="longitude";
}
public static class RoutesTable {
public static final String tableName="Routes";
public static final String colId="id";
public static final String colName="name";
public static final String colColor="color";
public static final String colWidth="width";
public static final String colVisible="visible";
}
public static class RoutePointsTable {
public static final String tableName="RoutePoints";
public static final String colId="_id";
public static final String colRouteId="routeId";
public static final String colLat="latitude";
public static final String colLon="longitude";
}
public static class StopsOnRoutesTable {
public static final String tableName="StopsOnRoutes";
public static final String colStopId="stopId";
public static final String colRouteId="routeId";
public static final String colFavorite="favorite";
public static final String colEta="eta";
}
public DatabaseHelper(Context context) {
super(context, dbName, null, 2);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + StopsTable.tableName + "(" +
" " + StopsTable.colId + " TEXT PRIMARY KEY," +
" " + StopsTable.colName + " TEXT," +
" " + StopsTable.colLat + " REAL," +
" " + StopsTable.colLon + " REAL" +
");");
db.execSQL("CREATE TABLE " + RoutesTable.tableName + "(" +
" " + RoutesTable.colId + " INTEGER PRIMARY KEY," +
" " + RoutesTable.colName + " TEXT," +
" " + RoutesTable.colColor + " TEXT," +
" " + RoutesTable.colWidth + " INTEGER," +
" " + RoutesTable.colVisible + " INTEGER" +
");");
db.execSQL("CREATE TABLE " + RoutePointsTable.tableName + "(" +
" " + RoutePointsTable.colId + " INTEGER PRIMARY KEY," +
" " + RoutePointsTable.colRouteId + " INTEGER," +
" " + RoutePointsTable.colLat + " REAL," +
" " + RoutePointsTable.colLon + " REAL" +
");");
db.execSQL("CREATE TABLE " + StopsOnRoutesTable.tableName + "(" +
" " + StopsOnRoutesTable.colStopId + " TEXT," +
" " + StopsOnRoutesTable.colRouteId + " INTEGER," +
" " + StopsOnRoutesTable.colFavorite + " INTEGER," +
" PRIMARY KEY(" + StopsOnRoutesTable.colStopId + ", " + StopsOnRoutesTable.colRouteId + ")" +
");");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion <= 1) {
db.execSQL("ALTER TABLE "+RoutesTable.tableName + " ADD " + RoutesTable.colVisible + " INTEGER");
ContentValues cv = new ContentValues();
cv.put(RoutesTable.colVisible, 1);
db.update(RoutesTable.tableName, cv, null, null);
cv = new ContentValues();
cv.put(RoutesTable.colName, "East Campus");
db.update(RoutesTable.tableName, cv, RoutesTable.colName + "='East Route'", null);
cv = new ContentValues();
cv.put(RoutesTable.colName, "West Campus");
db.update(RoutesTable.tableName, cv, RoutesTable.colName + "='West Route'", null);
}
}
public void putRoutes(Netlink routes) {
clearRoutes();
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv;
for (RouteJson r: routes.getRoutes()) {
cv = new ContentValues();
cv.put(RoutesTable.colName, r.getName());
cv.put(RoutesTable.colId, r.getId());
cv.put(RoutesTable.colColor, r.getColor());
cv.put(RoutesTable.colWidth, r.getWidth());
cv.put(RoutesTable.colVisible, r.getVisible() ? 1 : 0);
db.insert(RoutesTable.tableName, RoutesTable.colName, cv);
for (RouteCoordinateJson c : r.getCoords()) {
cv = new ContentValues();
cv.put(RoutePointsTable.colRouteId, r.getId());
cv.put(RoutePointsTable.colLat, c.getLatitude());
cv.put(RoutePointsTable.colLon, c.getLongitude());
db.insert(RoutePointsTable.tableName, RoutePointsTable.colLon, cv);
}
}
for (StopJson s : routes.getStops()) {
cv = new ContentValues();
cv.put(StopsTable.colName, s.getName());
cv.put(StopsTable.colId, s.getShort_name());
cv.put(StopsTable.colLat, s.getLatitude());
cv.put(StopsTable.colLon, s.getLongitude());
db.insert(StopsTable.tableName, StopsTable.colName, cv);
for (StopJson.StopRouteJson r : s.getRoutes()) {
cv = new ContentValues();
cv.put(StopsOnRoutesTable.colStopId, s.getShort_name());
cv.put(StopsOnRoutesTable.colRouteId, r.getId());
cv.put(StopsOnRoutesTable.colFavorite, 0);
db.insert(StopsOnRoutesTable.tableName, StopsOnRoutesTable.colFavorite, cv);
}
}
db.close();
}
public void setRouteVisibility(int routeId, boolean visible) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(RoutesTable.colVisible, visible ? 1 : 0);
db.update(RoutesTable.tableName, cv, RoutesTable.colId + "=" + routeId, null);
db.close();
}
public void clearRoutes() {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(RoutesTable.tableName, null, null);
db.delete(RoutePointsTable.tableName, null, null);
db.delete(StopsTable.tableName, null, null);
db.delete(StopsOnRoutesTable.tableName, null, null);
db.close();
}
public boolean hasRoutes() {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cur = db.rawQuery("SELECT * FROM " + RoutesTable.tableName, null);
boolean result = cur.getCount() > 0;
cur.close();
db.close();
return result;
}
public Netlink getRoutes() {
Netlink result = new Netlink();
ArrayList<RouteJson> routesArr = new ArrayList<Netlink.RouteJson>();
Cursor routes = getRoutesCursor();
routes.moveToFirst();
while (!routes.isAfterLast()) {
RouteJson r = new RouteJson();
r.setColor(routes.getString(routes.getColumnIndex(RoutesTable.colColor)));
r.setName(routes.getString(routes.getColumnIndex(RoutesTable.colName)));
r.setId(routes.getInt(routes.getColumnIndex(RoutesTable.colId)));
r.setWidth(routes.getInt(routes.getColumnIndex(RoutesTable.colWidth)));
r.setVisible(routes.getInt(routes.getColumnIndex(RoutesTable.colVisible)) != 0);
ArrayList<RouteCoordinateJson> pointsArr = new ArrayList<Netlink.RouteJson.RouteCoordinateJson>();
Cursor points = getRoutePoints(r.getId());
points.moveToFirst();
while (!points.isAfterLast()) {
RouteCoordinateJson p = new RouteCoordinateJson();
p.setLatitude(points.getDouble(points.getColumnIndex(RoutePointsTable.colLat)));
p.setLongitude(points.getDouble(points.getColumnIndex(RoutePointsTable.colLon)));
pointsArr.add(p);
points.moveToNext();
}
points.close();
r.setCoords(pointsArr);
routesArr.add(r);
routes.moveToNext();
}
routes.close();
ArrayList<StopJson> stopsArr = new ArrayList<Netlink.StopJson>();
Cursor stops = getStops();
stops.moveToFirst();
while (!stops.isAfterLast()) {
StopJson s = new StopJson();
s.setName(stops.getString(stops.getColumnIndex(StopsTable.colName)));
s.setShort_name(stops.getString(stops.getColumnIndex(StopsTable.colId)));
s.setLatitude(stops.getDouble(stops.getColumnIndex(StopsTable.colLat)));
s.setLongitude(stops.getDouble(stops.getColumnIndex(StopsTable.colLon)));
ArrayList<StopJson.StopRouteJson> routesByStopArr = new ArrayList<Netlink.StopJson.StopRouteJson>();
Cursor routesByStop = getRoutesByStop(s.getShort_name());
routesByStop.moveToFirst();
while (!routesByStop.isAfterLast()) {
StopJson.StopRouteJson r = new StopJson.StopRouteJson();
r.setId(routesByStop.getInt(0));
r.setName(routesByStop.getString(1));
routesByStopArr.add(r);
routesByStop.moveToNext();
}
routesByStop.close();
s.setRoutes(routesByStopArr);
stopsArr.add(s);
stops.moveToNext();
}
stops.close();
result.setRoutes(routesArr);
result.setStops(stopsArr);
return result;
}
private Cursor getRoutesByStop(String stopId) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cur = db.rawQuery("SELECT " + RoutesTable.colId + ", " + RoutesTable.colName +
" FROM (" + StopsOnRoutesTable.tableName + " JOIN " + RoutesTable.tableName + " ON " +
StopsOnRoutesTable.colRouteId + " = " + RoutesTable.colId + ") WHERE " + StopsOnRoutesTable.colStopId + "='" + stopId + "'", null);
return cur;
}
public Cursor getRoutesCursor() {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cur = db.rawQuery("SELECT * FROM " + RoutesTable.tableName, null);
return cur;
}
private Cursor getRoutePoints(int routeId) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cur = db.rawQuery("SELECT * FROM " + RoutePointsTable.tableName +
" WHERE " + RoutePointsTable.colRouteId + " = " + routeId, null);
return cur;
}
public Cursor getStops() {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cur = db.rawQuery("SELECT * FROM " + StopsTable.tableName, null);
return cur;
}
public void updateFavorites(List<FavoriteStop> favorites) {
SQLiteDatabase db = this.getReadableDatabase();
ContentValues cv = new ContentValues();
cv.put(StopsOnRoutesTable.colFavorite, 0);
db.update(StopsOnRoutesTable.tableName, cv, null, null);
for (FavoriteStop s : favorites) {
db.execSQL("UPDATE " + StopsOnRoutesTable.tableName + " SET " + StopsOnRoutesTable.colFavorite +
" = 1 WHERE " + StopsOnRoutesTable.colStopId + " = '" + s.stopId + "' AND " +
StopsOnRoutesTable.colRouteId + " = " + s.routeId);
}
db.close();
}
public List<FavoriteStop> getFavorites() {
List<FavoriteStop> result = new ArrayList<FavoriteStop>();
SQLiteDatabase db = this.getReadableDatabase();
Cursor cur = db.rawQuery("SELECT " + StopsTable.colId + ", " + StopsTable.colName + ", " +
StopsTable.colLat + ", " + StopsTable.colLon + ", " + StopsOnRoutesTable.colRouteId + " FROM ( " +
StopsOnRoutesTable.tableName + " JOIN " + StopsTable.tableName + " ON " +
StopsOnRoutesTable.colStopId + " = " + StopsTable.colId + ")" +
" WHERE " + StopsOnRoutesTable.colFavorite + " = 1", null);
cur.moveToFirst();
while (!cur.isAfterLast()) {
result.add(new FavoriteStop(cur.getInt(4), cur.getString(0)));
cur.moveToNext();
}
cur.close();
db.close();
return result;
}
public boolean isRouteVisible(int routeId) {
boolean result = false;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cur = db.rawQuery("SELECT * FROM " + RoutesTable.tableName +
" WHERE " + RoutesTable.colId + "=" + routeId +
" AND " + RoutesTable.colVisible + "=1", null);
if (cur.getCount() > 0) {
result = true;
}
cur.close();
db.close();
return result;
}
public boolean isStopFavorite(String stopId, int routeId) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cur = db.rawQuery("SELECT " + StopsOnRoutesTable.colFavorite +
" FROM " + StopsOnRoutesTable.tableName +
" WHERE stopId='" + stopId + "' AND routeId=" + routeId, null);
cur.moveToFirst();
boolean result = cur.getInt(0) == 1;
cur.close();
db.close();
return result;
}
public void setStopFavorite(String stopId, int routeId, boolean favorite) {
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("UPDATE " + StopsOnRoutesTable.tableName + " SET " +
StopsOnRoutesTable.colFavorite + "=" + (favorite ? 1 : 0) +
" WHERE " + StopsOnRoutesTable.colRouteId + "=" + routeId + " AND " +
StopsOnRoutesTable.colStopId + "='" + stopId + "'");
db.close();
}
}