package com.external.activeandroid.content; import java.util.ArrayList; import java.util.List; import android.app.Application; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.net.Uri; import android.util.SparseArray; import com.external.activeandroid.ActiveAndroid; import com.external.activeandroid.Cache; import com.external.activeandroid.Model; import com.external.activeandroid.TableInfo; public class ContentProvider extends android.content.ContentProvider { ////////////////////////////////////////////////////////////////////////////////////// // PRIVATE CONSTANTS ////////////////////////////////////////////////////////////////////////////////////// private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH); private static final SparseArray<Class<? extends Model>> TYPE_CODES = new SparseArray<Class<? extends Model>>(); ////////////////////////////////////////////////////////////////////////////////////// // PRIVATE MEMBERS ////////////////////////////////////////////////////////////////////////////////////// private String mAuthority; ////////////////////////////////////////////////////////////////////////////////////// // PUBLIC METHODS ////////////////////////////////////////////////////////////////////////////////////// @Override public boolean onCreate() { mAuthority = getContext().getPackageName(); ActiveAndroid.initialize((Application) getContext().getApplicationContext()); List<TableInfo> tableInfos = new ArrayList<TableInfo>(Cache.getTableInfos()); for (int i = 0; i < tableInfos.size(); i++) { TableInfo tableInfo = tableInfos.get(i); URI_MATCHER.addURI(mAuthority, tableInfo.getTableName().toLowerCase(), i); TYPE_CODES.put(i, tableInfo.getType()); } return true; } @Override public String getType(Uri uri) { return null; } // SQLite methods @Override public Uri insert(Uri uri, ContentValues values) { Class<? extends Model> type = getModelType(uri); Long id = Cache.openDatabase().insert(Cache.getTableName(type), null, values); if (id != null && id > 0) { Uri retUri = createUri(type, id); notifyChange(retUri); return retUri; } return null; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { Class<? extends Model> type = getModelType(uri); int count = Cache.openDatabase().update(Cache.getTableName(type), values, selection, selectionArgs); notifyChange(uri); return count; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { Class<? extends Model> type = getModelType(uri); int count = Cache.openDatabase().delete(Cache.getTableName(type), selection, selectionArgs); notifyChange(uri); return count; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { Class<? extends Model> type = getModelType(uri); return Cache.openDatabase().query(Cache.getTableName(type), projection, selection, selectionArgs, null, null, sortOrder); } ////////////////////////////////////////////////////////////////////////////////////// // PRIVATE METHODS ////////////////////////////////////////////////////////////////////////////////////// private Class<? extends Model> getModelType(Uri uri) { int code = URI_MATCHER.match(uri); if (code != UriMatcher.NO_MATCH) { return TYPE_CODES.get(code); } return null; } private Uri createUri(Class<? extends Model> type, Long id) { return Uri.parse("content://" + mAuthority + "/" + Cache.getTableName(type).toLowerCase() + "/" + id); } private void notifyChange(Uri uri) { getContext().getContentResolver().notifyChange(uri, null); } }