database refactoring

This commit is contained in:
Lukas Zielinski committed 2014-11-17 15:38:12 +01:00
1 parent 3456da7e35
commit e0dc338a92
4 files changed
+87 -168

No files matched your search

@@ -19,8 +19,8 @@ public class RegattaAdapter extends ResourceCursorAdapter {
public void bindView(View view, Context context, Cursor cursor) {
TextView name = (TextView) view.findViewById(R.id.regattaName);
if (name != null) {
String text = cursor.getString(cursor.getColumnIndex(AnalyticsContract.Event.EVENT_TITLE));
text += " (" + cursor.getString(cursor.getColumnIndex(AnalyticsContract.Competitor.COMPETITOR_NAME)) + ")";
String text = cursor.getString(cursor.getColumnIndex(AnalyticsContract.Event.EVENT_NAME));
text += " (" + cursor.getString(cursor.getColumnIndex(AnalyticsContract.Competitor.COMPETITOR_DISPLAY_NAME)) + ")";
name.setText(text);
}
}
@@ -7,17 +7,27 @@ import android.provider.BaseColumns;
public class AnalyticsContract {
interface CompetitorColumns {
String COMPETITOR_ID = "competitor_id";
String COMPETITOR_NAME = "competitor_name";
String COMPETITOR_PROFILE_IMAGE_URL = "profile_image_url";
String COMPETITOR_ID = "id";
String COMPETITOR_DISPLAY_NAME = "display_name";
String COMPETITOR_COUNTRY_CODE = "country_code";
String COMPETITOR_NATIONALITY = "nationality";
String COMPETITOR_SAIL_ID = "saild_id";
String COMPETITOR_LEADERBOARD_FK = "leaderboard_id";
}
interface LeaderboardColumns {
String LEADERBOARD_ID = "id";
String LEADERBOARD_NAME = "name";
}
interface EventColumns {
String EVENT_ID = "event_id";
String EVENT_DATE_END = "event_date_end";
String EVENT_DATE_START = "event_date_start";
String EVENT_SERVER = "event_server";
String EVENT_TITLE = "event_title";
String EVENT_ID = "id";
String EVENT_DATE_END = "date_end";
String EVENT_DATE_START = "date_start";
String EVENT_SERVER = "server";
String EVENT_IMAGE_URL = "image_url";
String EVENT_NAME = "name";
String COMPETITOR_LEADERBOARD_FK = "leaderboard_id";
}
interface SensorGpsColumns {
@@ -32,13 +42,7 @@ public class AnalyticsContract {
String GPS_SYNCED = "gps_synced";
String GPS_SPEED = "gps_speed";
String GPS_TIME = "gps_time";
}
interface MessageColumns {
String MESSAGE_URL = "message_url";
String MESSAGE_CALLBACK_PAYLOAD = "message_callback_payload";
String MESSAGE_PAYLOAD = "message_payload";
String MESSAGE_CALLBACK_CLASS_STRING = "message_callback_class_string";
String GPS_EVENT_FK = "event_id";
}
public static final String CONTENT_AUTHORITY = "com.sap.sailing.android.tracking.app.provider.db";
@@ -47,7 +51,7 @@ public class AnalyticsContract {
private static final String PATH_COMPETITOR = "competitors";
private static final String PATH_EVENT = "events";
private static final String PATH_MESSAGE = "messages";
private static final String PATH_LEADERBOARD = "leaderboards";
private static final String PATH_SENSOR_GPS = "sensor_gps";
public static class Competitor implements CompetitorColumns, BaseColumns {
@@ -55,8 +59,7 @@ public class AnalyticsContract {
public static final String CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/vnd.sap_sailing_analytics.competitor";
public static final String CONTENT_ITEM_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE + "/vnd.sap_sailing_analytics.competitor";
public static final String DEFAULT_SORT = CompetitorColumns.COMPETITOR_NAME + " COLLATE NOCASE ASC";
public static final String DEFAULT_SORT = CompetitorColumns.COMPETITOR_ID + " COLLATE NOCASE ASC";
public static Uri buildCompetitorUri(String competitorId) {
return CONTENT_URI.buildUpon().appendPath(competitorId).build();
@@ -76,8 +79,7 @@ public class AnalyticsContract {
public static final String CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/vnd.sap_sailing_analytics.event";
public static final String CONTENT_ITEM_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE + "/vnd.sap_sailing_analytics.event";
public static final String DEFAULT_SORT = EventColumns.EVENT_TITLE + " COLLATE NOCASE ASC ";
public static final String DEFAULT_SORT = EventColumns.EVENT_NAME + " COLLATE NOCASE ASC ";
public static Uri buildEventUri(String eventId) {
return CONTENT_URI.buildUpon().appendPath(eventId).build();
@@ -92,35 +94,11 @@ public class AnalyticsContract {
}
}
public static class EventCompetitor implements EventColumns, CompetitorColumns, BaseColumns {
public static final Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon().appendPath(PATH_EVENT).appendPath(PATH_COMPETITOR).build();
public static final String CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/vnd.sap_sailing_analytics.event.competitor";
}
public static class Message implements MessageColumns, BaseColumns {
public static final Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon().appendPath(PATH_MESSAGE).build();
public static final String CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/vnd.sap_sailing_analytics.message";
public static final String CONTENT_ITEM_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE + "/vnd.sap_sailing_analytics.message";
public static final String DEFAULT_SORT = BaseColumns._ID + " ASC ";
public static Uri buildMessageUri(String messageId) {
return CONTENT_URI.buildUpon().appendPath(messageId).build();
}
public static String getMessageId(Uri uri) {
return uri.getPathSegments().get(1);
}
}
public static class SensorGps implements SensorGpsColumns, BaseColumns {
public static final Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon().appendPath(PATH_SENSOR_GPS).build();
public static final String CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/vnd.sap_sailing_analytics.sensor.gps";
public static final String CONTENT_ITEM_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE + "/vnd.sap_sailing_analytics.sensor.gps";
public static final String DEFAULT_SORT = BaseColumns._ID + " ASC ";
public static Uri buildSensorGpsUri(String gpsId) {
@@ -132,6 +110,24 @@ public class AnalyticsContract {
}
}
public static class Leaderboard implements LeaderboardColumns {
public static final Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon().appendPath(PATH_LEADERBOARD).build();
public static final String CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/vnd.sap_sailing_analytics.leaderboard";
public static final String CONTENT_ITEM_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE + "/vnd.sap_sailing_analytics.leaderboard";
public static final String DEFAULT_SORT = BaseColumns._ID + " ASC ";
public static Uri buildLeaderboardUri(String leaderboardId)
{
return CONTENT_URI.buildUpon().appendPath(leaderboardId).build();
}
public static String getLeaderboardId(Uri uri) {
return uri.getPathSegments().get(1);
}
}
private AnalyticsContract() {
}
@@ -6,11 +6,9 @@ import android.database.sqlite.SQLiteOpenHelper;
import android.provider.BaseColumns;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.Competitor;
import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.CompetitorColumns;
import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.Event;
import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.EventColumns;
import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.MessageColumns;
import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.LeaderboardColumns;
import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.SensorGpsColumns;
public class AnalyticsDatabase extends SQLiteOpenHelper {
@@ -29,88 +27,37 @@ public class AnalyticsDatabase extends SQLiteOpenHelper {
String EVENTS = "events";
String EVENTS_COMPETITORS = "events_competitors";
String SENSOR_GPS = "sensor_gps";
String MESSAGES = "messages";
String EVENTS_JOIN_COMPETITOR = "events_competitors "
+ "LEFT OUTER JOIN competitors ON events_competitors.competitor_id = competitors.competitor_id "
+ "LEFT OUTER JOIN events ON events_competitors.event_id = events.event_id ";
}
private interface Triggers {
String COMPETITORS_DELETE_00 = "competitors_delete_00";
String EVENTS_DELETE_00 = "events_delete_00";
}
public interface EventCompetitor {
String EVENT_ID = EventColumns.EVENT_ID;
String COMPETITOR_ID = CompetitorColumns.COMPETITOR_ID;
}
public interface Qualified {
String EVENT_COMPETITOR_EVENT_ID = Tables.EVENTS_COMPETITORS + "." + EventCompetitor.EVENT_ID;
String EVENT_COMPETITOR_COMPETITOR_ID = Tables.EVENTS_COMPETITORS + "." + EventCompetitor.COMPETITOR_ID;
}
public interface References {
String COMPETITOR_ID = "REFERENCES " + Tables.COMPETITORS + "." + Competitor.COMPETITOR_ID;
String EVENT_ID = "REFERENCES " + Tables.EVENTS + "." + Event.EVENT_ID;
String LEADERBOARDS = "leaderboards";
}
public AnalyticsDatabase(Context context) {
super(context, DATABASE_NAME, null, CUR_DATABASE_VERSION);
mContext = context;
}
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
if (!db.isReadOnly()) {
db.execSQL("PRAGMA recursive_triggers = true");
}
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + Tables.COMPETITORS + " ("
+ BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ CompetitorColumns.COMPETITOR_ID + " TEXT NOT NULL, "
+ CompetitorColumns.COMPETITOR_NAME + " TEXT NOT NULL, "
+ CompetitorColumns.COMPETITOR_PROFILE_IMAGE_URL + " TEXT, "
+ "UNIQUE (" + CompetitorColumns.COMPETITOR_ID + ") ON CONFLICT REPLACE)");
+ CompetitorColumns.COMPETITOR_DISPLAY_NAME + " TEXT NOT NULL, "
+ CompetitorColumns.COMPETITOR_COUNTRY_CODE + " TEXT, "
+ CompetitorColumns.COMPETITOR_NATIONALITY + " TEXT, "
+ CompetitorColumns.COMPETITOR_SAIL_ID + " TEXT, "
+ "FOREIGN KEY (" + CompetitorColumns.COMPETITOR_LEADERBOARD_FK + ") "
+ "REFERENCES " + Tables.LEADERBOARDS + "( " + LeaderboardColumns.LEADERBOARD_ID + " ))");
db.execSQL("CREATE TABLE " + Tables.EVENTS + " ( "
+ BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ EventColumns.EVENT_ID + " TEXT NOT NULL, "
+ EventColumns.EVENT_TITLE + " TEXT NOT NULL, "
+ EventColumns.EVENT_NAME + " TEXT NOT NULL, "
+ EventColumns.EVENT_DATE_START + " INTEGER, "
+ EventColumns.EVENT_DATE_END + " INTEGER, "
+ EventColumns.EVENT_SERVER + " STRING, "
+ "UNIQUE (" + EventColumns.EVENT_ID + ") ON CONFLICT REPLACE)");
db.execSQL("CREATE TABLE " + Tables.EVENTS_COMPETITORS + " ( "
+ BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ EventColumns.EVENT_ID + " TEXT NOT NULL, "
+ CompetitorColumns.COMPETITOR_ID + " TEXT NOT NULL "
+ ")");
db.execSQL("CREATE TRIGGER " + Triggers.COMPETITORS_DELETE_00 + " BEFORE DELETE ON "
+ Tables.COMPETITORS + " BEGIN DELETE FROM " + Tables.EVENTS_COMPETITORS + " "
+ " WHERE " + Qualified.EVENT_COMPETITOR_COMPETITOR_ID + " = old." + CompetitorColumns.COMPETITOR_ID
+ ";" + " END;");
db.execSQL("CREATE TRIGGER " + Triggers.EVENTS_DELETE_00 + " BEFORE DELETE ON "
+ Tables.EVENTS + " BEGIN DELETE FROM " + Tables.EVENTS_COMPETITORS + " "
+ " WHERE " + Qualified.EVENT_COMPETITOR_EVENT_ID + " = old." + EventColumns.EVENT_ID
+ ";" + " END;");
db.execSQL("CREATE TABLE " + Tables.MESSAGES + " ( "
+ BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ MessageColumns.MESSAGE_URL + " TEXT NOT NULL, "
+ MessageColumns.MESSAGE_PAYLOAD + " TEXT, "
+ MessageColumns.MESSAGE_CALLBACK_CLASS_STRING + " TEXT, "
+ MessageColumns.MESSAGE_CALLBACK_PAYLOAD + " TEXT "
+ ")");
+ EventColumns.EVENT_SERVER + " TEXT, "
+ EventColumns.EVENT_IMAGE_URL + " TEXT, "
+ "FOREIGN KEY (" + EventColumns.COMPETITOR_LEADERBOARD_FK + ") "
+ "REFERENCES " + Tables.LEADERBOARDS + "( " + LeaderboardColumns.LEADERBOARD_ID + " ))");
db.execSQL("CREATE TABLE " + Tables.SENSOR_GPS + " ( "
+ BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ SensorGpsColumns.GPS_ACCURACY + " TEXT, "
@@ -124,7 +71,8 @@ public class AnalyticsDatabase extends SQLiteOpenHelper {
+ SensorGpsColumns.GPS_SPEED + " TEXT, "
+ SensorGpsColumns.GPS_SYNCED + " INTEGER DEFAULT 0, "
+ SensorGpsColumns.GPS_TIME + " TEXT "
+ ")");
+ "FOREIGN KEY (" + SensorGpsColumns.GPS_EVENT_FK + ") "
+ "REFERENCES " + Tables.EVENTS + "( " + EventColumns.EVENT_ID + " ))");
}
@Override
@@ -136,14 +84,10 @@ public class AnalyticsDatabase extends SQLiteOpenHelper {
if (version != CUR_DATABASE_VERSION) {
ExLog.i(mContext, TAG, "Upgrade unsuccessful - destroying old data during upgrade");
db.execSQL("DROP TRIGGER IF EXISTS " + Triggers.COMPETITORS_DELETE_00);
db.execSQL("DROP TRIGGER IF EXISTS " + Triggers.EVENTS_DELETE_00);
db.execSQL("DROP TABLE IF EXISTS " + Tables.COMPETITORS);
db.execSQL("DROP TABLE IF EXISTS " + Tables.EVENTS);
db.execSQL("DROP TABLE IF EXISTS " + Tables.EVENTS_COMPETITORS);
db.execSQL("DROP TABLE IF EXISTS " + Tables.MESSAGES);
db.execSQL("DROP TABLE IF EXISTS " + Tables.SENSOR_GPS);
db.execSQL("DROP TABLE IF EXISTS " + Tables.LEADERBOARDS);
onCreate(db);
version = CUR_DATABASE_VERSION;
@@ -9,14 +9,13 @@ import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.provider.BaseColumns;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.util.SelectionBuilder;
import com.sap.sailing.android.tracking.app.BuildConfig;
import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.Competitor;
import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.Event;
import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.Message;
import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.Leaderboard;
import com.sap.sailing.android.tracking.app.provider.AnalyticsContract.SensorGps;
import com.sap.sailing.android.tracking.app.provider.AnalyticsDatabase.Tables;
@@ -33,9 +32,9 @@ public class AnalyticsProvider extends ContentProvider {
private static final int EVENT = 200;
private static final int EVENT_ID = 201;
private static final int EVENT_ID_COMPETITOR = 202;
private static final int EVENT_COMPETITOR = 300;
private static final int LEADERBOARD = 300;
private static final int LEADERBOARD_ID = 301;
private static final int MESSAGE = 400;
private static final int MESSAGE_ID = 401;
@@ -50,11 +49,11 @@ public class AnalyticsProvider extends ContentProvider {
matcher.addURI(authority, "competitors", COMPETITOR);
matcher.addURI(authority, "competitors/*", COMPETITOR_ID);
matcher.addURI(authority, "events/competitors", EVENT_COMPETITOR);
matcher.addURI(authority, "leaderboards", LEADERBOARD);
matcher.addURI(authority, "leaderboards/*", LEADERBOARD_ID);
matcher.addURI(authority, "events", EVENT);
matcher.addURI(authority, "events/*", EVENT_ID);
matcher.addURI(authority, "events/*/competitors", EVENT_ID_COMPETITOR);
matcher.addURI(authority, "messages", MESSAGE);
matcher.addURI(authority, "messages/#", MESSAGE_ID);
@@ -71,12 +70,12 @@ public class AnalyticsProvider extends ContentProvider {
return true;
}
private void deleteDatabase() {
Context context = getContext();
mOpenHelper.close();
AnalyticsDatabase.deleteDatabase(context);
mOpenHelper = new AnalyticsDatabase(context);
}
// private void deleteDatabase() {
// Context context = getContext();
// mOpenHelper.close();
// AnalyticsDatabase.deleteDatabase(context);
// mOpenHelper = new AnalyticsDatabase(context);
// }
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
@@ -119,17 +118,11 @@ public class AnalyticsProvider extends ContentProvider {
case EVENT_ID:
return Event.CONTENT_ITEM_TYPE;
case EVENT_ID_COMPETITOR:
return Event.CONTENT_ITEM_TYPE;
case EVENT_COMPETITOR:
return AnalyticsContract.EventCompetitor.CONTENT_TYPE;
case MESSAGE:
return Message.CONTENT_TYPE;
case MESSAGE_ID:
return Message.CONTENT_ITEM_TYPE;
case LEADERBOARD:
return Leaderboard.CONTENT_TYPE;
case LEADERBOARD_ID:
return Leaderboard.CONTENT_ITEM_TYPE;
case SENSOR_GPS:
return SensorGps.CONTENT_TYPE;
@@ -162,15 +155,10 @@ public class AnalyticsProvider extends ContentProvider {
notifyChange(uri);
return Event.buildEventUri(values.getAsString(Event.EVENT_ID));
case EVENT_ID_COMPETITOR:
db.insertOrThrow(Tables.EVENTS_COMPETITORS, null, values);
notifyChange(uri);
return Event.buildCompetitorsDirUri(values.getAsString(Event.EVENT_ID));
case MESSAGE:
db.insertOrThrow(Tables.MESSAGES, null, values);
notifyChange(uri);
return Message.buildMessageUri("XX");
case LEADERBOARD:
db.insertOrThrow(Tables.LEADERBOARDS, null, values);
notifyChange(uri);
return Leaderboard.buildLeaderboardUri(values.getAsString(Leaderboard.LEADERBOARD_ID));
case SENSOR_GPS:
db.insertOrThrow(Tables.SENSOR_GPS, null, values);
@@ -247,6 +235,14 @@ public class AnalyticsProvider extends ContentProvider {
return builder.table(Tables.COMPETITORS)
.where(Competitor.COMPETITOR_ID + " = ?", competitor_id);
case LEADERBOARD:
return builder.table(Tables.LEADERBOARDS);
case LEADERBOARD_ID:
final String leaderboard_id = Leaderboard.getLeaderboardId(uri);
return builder.table(Tables.LEADERBOARDS)
.where(Leaderboard.LEADERBOARD_ID + " = ?", leaderboard_id);
case EVENT:
return builder.table(Tables.EVENTS);
@@ -255,23 +251,6 @@ public class AnalyticsProvider extends ContentProvider {
return builder.table(Tables.EVENTS)
.where(Event.EVENT_ID + " = ?", event_id);
case EVENT_ID_COMPETITOR:
final String event_competitor_id = Event.getEventId(uri);
return builder.table(Tables.EVENTS_JOIN_COMPETITOR)
.mapToTable(BaseColumns._ID, Tables.EVENTS_COMPETITORS)
.mapToTable(Competitor.COMPETITOR_ID, Tables.COMPETITORS)
.mapToTable(Event.EVENT_ID, Tables.EVENTS)
.where(Event.EVENT_ID + " = ?", event_competitor_id);
case EVENT_COMPETITOR:
return builder.table(Tables.EVENTS_JOIN_COMPETITOR)
.mapToTable(BaseColumns._ID, Tables.EVENTS_COMPETITORS)
.mapToTable(Competitor.COMPETITOR_ID, Tables.COMPETITORS)
.mapToTable(Event.EVENT_ID, Tables.EVENTS);
case MESSAGE:
return builder.table(Tables.MESSAGES);
case SENSOR_GPS:
return builder.table(Tables.SENSOR_GPS);