package im.zico.wingtwitter.dao; import android.content.*; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteQueryBuilder; import android.net.Uri; import android.util.Log; import im.zico.wingtwitter.WingApp; /** * Created by Issac on 7/18/13. */ public class WingDataProvider extends ContentProvider { private static final String TAG = "WingDataProvider"; static final Object DBLock = new Object(); public static final String AUTHORITY = "im.zico.wing.provider"; public static final String SCHEME = "content://"; public static final String PATH_STATUSES = "/" + WingStore.TweetColumns.TABLE_NAME; public static final String PATH_USERS = "/" + WingStore.UserColumns.TABLE_NAME; public static final String PATH_MENTIONS = "/" + WingStore.MentionedCollumns.TABLE_NAME; public static final String PATH_FAVORITES = "/" + WingStore.FavoriteCollumns.TABLE_NAME; public static final String PATH_COMMON_TWEETS = "/" + WingStore.CommonTweetColumns.TABLE_NAME; public static final String PATH_FOLLOWINGS = "/" + WingStore.FollowingColumns.TABLE_NAME; public static final Uri STATUS_CONTENT_URI = Uri.parse(SCHEME + AUTHORITY + PATH_STATUSES); public static final Uri USER_CONTENT_URI = Uri.parse(SCHEME + AUTHORITY + PATH_USERS); public static final Uri MENTION_CONTENT_URI = Uri.parse(SCHEME + AUTHORITY + PATH_MENTIONS); public static final Uri FAVORITE_CONTENT_URI = Uri.parse(SCHEME + AUTHORITY + PATH_FAVORITES); public static final Uri COMMON_TWEETS_URI = Uri.parse(SCHEME + AUTHORITY + PATH_COMMON_TWEETS); public static final Uri FOLLOWINGS_URI = Uri.parse(SCHEME + AUTHORITY + PATH_FOLLOWINGS); /* * MIME type definitions */ public static final String STATUS_CONTENT_TYPE = "vnd.android.cursor.dir/vnd.zico.wing.status"; public static final String MENTION_CONTENT_TYPE = "vnd.android.cursor.dir/vnd.zico.wing.mention"; public static final String FAVORITE_CONTENT_TYPE = "vnd.android.cursor.dir/vnd.zico.wing.favorite"; public static final String USER_CONTENT_TYPE = "vnd.android.cursor.dir/vnd.zico.wing.user"; public static final String COMMON_TWEET_CONTENT_TYPE = "vnd.android.cursor.dir/vnd.zico.wing.common_tweets"; public static final String FOLLOWING_CONTENT_TYPE = "vnd.android.cursor.dir/vnd.zico.wing.following"; private static final UriMatcher sUriMatcher; static { sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); sUriMatcher.addURI(AUTHORITY, WingStore.TweetColumns.TABLE_NAME, WingStore.TYPE_TWEET); sUriMatcher.addURI(AUTHORITY, WingStore.MentionedCollumns.TABLE_NAME, WingStore.TYPE_MENTION); sUriMatcher.addURI(AUTHORITY, WingStore.FavoriteCollumns.TABLE_NAME, WingStore.TYPE_FAVORITE); sUriMatcher.addURI(AUTHORITY, WingStore.UserColumns.TABLE_NAME, WingStore.TYPE_USER); sUriMatcher.addURI(AUTHORITY, WingStore.CommonTweetColumns.TABLE_NAME, WingStore.TYPE_COMMON_TWEET); sUriMatcher.addURI(AUTHORITY, WingStore.FollowingColumns.TABLE_NAME, WingStore.TYPE_FOLLOWING); } private static MSQLiteOpenHelper mDBHelper; @Override public boolean onCreate() { return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { synchronized (DBLock) { SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); String table = matchTable(uri); queryBuilder.setTables(table); SQLiteDatabase db = getDBHelper().getReadableDatabase(); Cursor cursor = queryBuilder.query(db, // The database to // queryFromDB projection, // The columns to return from the queryFromDB selection, // The columns for the where clause selectionArgs, // The values for the where clause null, // don't group the rows null, // don't filter by row groups sortOrder // The sort order ); cursor.setNotificationUri(getContext().getContentResolver(), uri); return cursor; } } @Override public String getType(Uri uri) { switch (sUriMatcher.match(uri)) { case WingStore.TYPE_TWEET: return STATUS_CONTENT_TYPE; case WingStore.TYPE_MENTION: return MENTION_CONTENT_TYPE; case WingStore.TYPE_USER: return USER_CONTENT_TYPE; case WingStore.TYPE_FAVORITE: return FAVORITE_CONTENT_TYPE; case WingStore.TYPE_COMMON_TWEET: return COMMON_TWEET_CONTENT_TYPE; case WingStore.TYPE_FOLLOWING: return FOLLOWING_CONTENT_TYPE; default: throw new IllegalArgumentException("Unknown URI " + uri); } } @Override public Uri insert(Uri uri, ContentValues values) { synchronized (DBLock) { String table = matchTable(uri); SQLiteDatabase db = getDBHelper().getWritableDatabase(); long rowId = 0; db.beginTransaction(); try { rowId = db.insert(table, null, values); db.setTransactionSuccessful(); } catch (Exception e) { Log.e(TAG, e.getMessage()); } finally { db.endTransaction(); } if (rowId > 0) { Uri returnUri = ContentUris.withAppendedId(uri, rowId); getContext().getContentResolver().notifyChange(uri, null); return returnUri; } throw new SQLException("Failed to insert row into " + uri); } } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { synchronized (DBLock) { SQLiteDatabase db = getDBHelper().getWritableDatabase(); int count = 0; String table = matchTable(uri); db.beginTransaction(); try { count = db.delete(table, selection, selectionArgs); db.setTransactionSuccessful(); } finally { db.endTransaction(); } getContext().getContentResolver().notifyChange(uri, null); return count; } } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { synchronized (DBLock) { SQLiteDatabase db = getDBHelper().getWritableDatabase(); int count; String table = matchTable(uri); db.beginTransaction(); try { count = db.update(table, values, selection, selectionArgs); db.setTransactionSuccessful(); } finally { db.endTransaction(); } getContext().getContentResolver().notifyChange(uri, null); return count; } } public static MSQLiteOpenHelper getDBHelper() { if (mDBHelper == null) { mDBHelper = new MSQLiteOpenHelper(WingApp.getContext()); } return mDBHelper; } private String matchTable(Uri uri) { String table; switch (sUriMatcher.match(uri)) { case WingStore.TYPE_TWEET: table = WingStore.TweetColumns.TABLE_NAME; break; case WingStore.TYPE_MENTION: table = WingStore.MentionedCollumns.TABLE_NAME; break; case WingStore.TYPE_USER: table = WingStore.UserColumns.TABLE_NAME; break; case WingStore.TYPE_FAVORITE: table = WingStore.FavoriteCollumns.TABLE_NAME; break; case WingStore.TYPE_COMMON_TWEET: table = WingStore.CommonTweetColumns.TABLE_NAME; break; case WingStore.TYPE_FOLLOWING: table = WingStore.FollowingColumns.TABLE_NAME; break; default: throw new IllegalArgumentException("Unknown URI " + uri); } return table; } }