package com.transitwidget.provider; import android.content.ContentProvider; import android.content.ContentValues; import android.content.Context; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteQueryBuilder; import android.net.Uri; import android.provider.BaseColumns; import android.util.Log; import com.transitwidget.feed.model.Agency; import com.transitwidget.feed.model.Direction; import com.transitwidget.feed.model.Favorite; import com.transitwidget.feed.model.Route; import com.transitwidget.feed.model.Stop; public class TransitServiceDataProvider extends ContentProvider { private static final String TAG = TransitServiceDataProvider.class.getName(); private static final String DATABASE_NAME = "transitServiceData.db"; private static final int DATABASE_VERSION = 4; public static final String AUTHORITY = "transitwidget.provider.TransitServiceDataProvider"; // URI matching constants private static final int AGENCIES = 1; private static final int AGENCY_ID = 2; private static final int ROUTES = 3; private static final int ROUTE_ID = 4; private static final int DIRECTIONS = 5; private static final int DIRECTION_ID = 6; private static final int STOPS = 7; private static final int STOP_ID = 8; private static final int FAVORITES = 9; private static final int FAVORITE_ID = 10; private static final UriMatcher sUriMatcher; private DatabaseHelper mHelper; private SQLiteDatabase database; static { sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); sUriMatcher.addURI(AUTHORITY, Agency.TABLE_NAME, AGENCIES); sUriMatcher.addURI(AUTHORITY, Agency.TABLE_NAME + "/#", AGENCY_ID); sUriMatcher.addURI(AUTHORITY, Route.TABLE_NAME, ROUTES); sUriMatcher.addURI(AUTHORITY, Route.TABLE_NAME + "/#", ROUTE_ID); sUriMatcher.addURI(AUTHORITY, Direction.TABLE_NAME, DIRECTIONS); sUriMatcher.addURI(AUTHORITY, Direction.TABLE_NAME + "/#", DIRECTION_ID); sUriMatcher.addURI(AUTHORITY, Stop.TABLE_NAME, STOPS); sUriMatcher.addURI(AUTHORITY, Stop.TABLE_NAME + "/#", STOP_ID); sUriMatcher.addURI(AUTHORITY, Favorite.TABLE_NAME, FAVORITES); sUriMatcher.addURI(AUTHORITY, Favorite.TABLE_NAME + "/#", FAVORITE_ID); } @Override public boolean onCreate() { mHelper = new DatabaseHelper(getContext()); database = mHelper.getWritableDatabase(); return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteQueryBuilder qBuilder = new SQLiteQueryBuilder(); int match = sUriMatcher.match(uri); switch (match) { case AGENCIES: qBuilder.setTables(Agency.TABLE_NAME); break; case AGENCY_ID: qBuilder.setTables(Agency.TABLE_NAME); qBuilder.appendWhere(Agency._ID + " = " + uri.getLastPathSegment()); break; case ROUTES: qBuilder.setTables(Route.TABLE_NAME); break; case ROUTE_ID: qBuilder.setTables(Route.TABLE_NAME); qBuilder.appendWhere(Route._ID + " = " + uri.getLastPathSegment()); break; case DIRECTIONS: qBuilder.setTables(Direction.TABLE_NAME); break; case DIRECTION_ID: qBuilder.setTables(Direction.TABLE_NAME); qBuilder.appendWhere(Direction._ID + " = " + uri.getLastPathSegment()); break; case STOPS: qBuilder.setTables(Stop.TABLE_NAME); break; case STOP_ID: qBuilder.setTables(Stop.TABLE_NAME); qBuilder.appendWhere(Stop._ID + " = " + uri.getLastPathSegment()); break; case FAVORITES: qBuilder.setTables(Favorite.TABLE_NAME); break; case FAVORITE_ID: qBuilder.setTables(Favorite.TABLE_NAME); qBuilder.appendWhere(Favorite._ID + " = " + uri.getLastPathSegment()); break; default: throw new IllegalArgumentException("URI " + uri + " not recognized by widget configuration content provider."); } // Make the query. Cursor c = qBuilder.query(database, projection, selection, selectionArgs, null, null, sortOrder); c.setNotificationUri(getContext().getContentResolver(), uri); return c; } @Override public String getType(Uri uri) { int match = sUriMatcher.match(uri); switch (match) { case AGENCIES: return Agency.CONTENT_TYPE; case AGENCY_ID: return Agency.CONTENT_TYPE_ITEM; case ROUTES: return Route.CONTENT_TYPE; case ROUTE_ID: return Route.CONTENT_TYPE_ITEM; case DIRECTIONS: return Direction.CONTENT_TYPE; case DIRECTION_ID: return Direction.CONTENT_TYPE_ITEM; case STOPS: return Stop.CONTENT_TYPE; case STOP_ID: return Stop.CONTENT_TYPE_ITEM; case FAVORITES: return Favorite.CONTENT_TYPE; case FAVORITE_ID: return Favorite.CONTENT_TYPE_ITEM; default: return null; } } @Override public Uri insert(Uri uri, ContentValues values) { String table = null; Uri baseUri = null; int match = sUriMatcher.match(uri); switch (match) { case AGENCIES: table = Agency.TABLE_NAME; baseUri = Agency.CONTENT_URI; break; case ROUTES: table = Route.TABLE_NAME; baseUri = Route.CONTENT_URI; break; case DIRECTIONS: table = Direction.TABLE_NAME; baseUri = Direction.CONTENT_URI; break; case STOPS: table = Stop.TABLE_NAME; baseUri = Stop.CONTENT_URI; break; case FAVORITES: table = Favorite.TABLE_NAME; baseUri = Favorite.CONTENT_URI; break; default: throw new IllegalArgumentException("URI " + uri + " cannot be inserted by widget configuration content provider."); } long id = database.insert(table, null, values); // Log.d(TAG, "DB: " + id + " -> " + values); getContext().getContentResolver().notifyChange(baseUri, null); return Uri.withAppendedPath(baseUri, String.valueOf(id)); } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { String table = null; int match = sUriMatcher.match(uri); switch (match) { case AGENCIES: table = Agency.TABLE_NAME; break; case ROUTES: table = Route.TABLE_NAME; break; case DIRECTIONS: table = Direction.TABLE_NAME; break; case STOPS: table = Stop.TABLE_NAME; break; case FAVORITES: table = Favorite.TABLE_NAME; break; default: throw new IllegalArgumentException("URI " + uri + " cannot be deleted by widget configuration content provider."); } int count = database.delete(table, selection, selectionArgs); getContext().getContentResolver().notifyChange(uri, null); return count; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { String table = null; int match = sUriMatcher.match(uri); switch (match) { case AGENCY_ID: selection = BaseColumns._ID + " = " + uri.getLastPathSegment(); case AGENCIES: table = Agency.TABLE_NAME; break; case ROUTE_ID: selection = BaseColumns._ID + " = " + uri.getLastPathSegment(); case ROUTES: table = Route.TABLE_NAME; break; case DIRECTION_ID: selection = BaseColumns._ID + " = " + uri.getLastPathSegment(); case DIRECTIONS: table = Direction.TABLE_NAME; break; case STOP_ID: selection = BaseColumns._ID + " = " + uri.getLastPathSegment(); case STOPS: table = Stop.TABLE_NAME; break; case FAVORITE_ID: selection = BaseColumns._ID + " = " + uri.getLastPathSegment(); case FAVORITES: table = Favorite.TABLE_NAME; break; default: throw new IllegalArgumentException("URI " + uri + " cannot be updated by widget configuration content provider."); } int count = database.update(table, values, selection, selectionArgs); getContext().getContentResolver().notifyChange(uri, null); return count; } class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { // calls the super constructor, requesting the default cursor factory. super(context, DATABASE_NAME, null, DATABASE_VERSION); } /** * Creates the underlying database. */ @Override public void onCreate(SQLiteDatabase db) { Agency.onCreate(db); Route.onCreate(db); Direction.onCreate(db); Stop.onCreate(db); Favorite.onCreate(db); } /** * Upgrade the database tables. */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // Logs that the database is being upgraded Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion); Agency.onUpgrade(db, oldVersion, newVersion); Route.onUpgrade(db, oldVersion, newVersion); Direction.onUpgrade(db, oldVersion, newVersion); Stop.onUpgrade(db, oldVersion, newVersion); Favorite.onUpgrade(db, oldVersion, newVersion); } } }