package com.malmstein.yahnac.data; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; public class HNewsProvider extends ContentProvider { private static final UriMatcher sUriMatcher = buildUriMatcher(); private HNewsDbHelper mOpenHelper; private static final int STORY = 100; private static final int STORY_ITEM = 101; private static final int COMMENT = 102; private static final int BOOKMARK = 103; @Override public boolean onCreate() { mOpenHelper = new HNewsDbHelper(getContext()); mOpenHelper.getReadableDatabase().execSQL("PRAGMA foreign_keys=ON"); return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { Cursor retCursor; switch (sUriMatcher.match(uri)) { case STORY: { retCursor = mOpenHelper.getReadableDatabase().query( HNewsContract.TABLE_ITEM_NAME, projection, selection, selectionArgs, null, null, sortOrder ); break; } case STORY_ITEM: { retCursor = mOpenHelper.getReadableDatabase().query( HNewsContract.TABLE_ITEM_NAME, projection, HNewsContract.StoryEntry._ID + " = '" + ContentUris.parseId(uri) + "'", null, null, null, sortOrder ); break; } case COMMENT: { retCursor = mOpenHelper.getReadableDatabase().query( HNewsContract.TABLE_COMMENTS_NAME, projection, selection, selectionArgs, null, null, sortOrder ); break; } case BOOKMARK: { retCursor = mOpenHelper.getReadableDatabase().query( HNewsContract.TABLE_BOOKMARKS_NAME, projection, selection, selectionArgs, null, null, sortOrder ); break; } default: throw new UnsupportedOperationException("Unknown uri: " + uri); } retCursor.setNotificationUri(getContext().getContentResolver(), uri); return retCursor; } @Override public String getType(Uri uri) { final int match = sUriMatcher.match(uri); switch (match) { case STORY: return HNewsContract.CONTENT_STORY_TYPE; case STORY_ITEM: return HNewsContract.CONTENT_STORY_ITEM_TYPE; case COMMENT: return HNewsContract.CONTENT_COMMENT_TYPE; default: throw new UnsupportedOperationException("Unknown uri: " + uri); } } @Override public Uri insert(Uri uri, ContentValues values) { final SQLiteDatabase db = mOpenHelper.getWritableDatabase(); final int match = sUriMatcher.match(uri); Uri returnUri; switch (match) { case STORY: { Cursor exists = db.query(HNewsContract.TABLE_ITEM_NAME, new String[]{HNewsContract.StoryEntry.ITEM_ID}, HNewsContract.StoryEntry.ITEM_ID + " = ?", new String[]{values.getAsString(HNewsContract.StoryEntry.ITEM_ID)}, null, null, null); if (exists.moveToLast()) { long _id = db.update(HNewsContract.TABLE_ITEM_NAME, values, HNewsContract.StoryEntry.ITEM_ID + " = ?", new String[]{values.getAsString(HNewsContract.StoryEntry.ITEM_ID)}); if (_id > 0) { returnUri = HNewsContract.StoryEntry.buildStoryUriWith(_id); } else { throw new android.database.SQLException("Failed to insert row into " + uri); } } else { long _id = db.insert(HNewsContract.TABLE_ITEM_NAME, null, values); if (_id > 0) { returnUri = HNewsContract.StoryEntry.buildStoryUriWith(_id); } else { throw new android.database.SQLException("Failed to insert row into " + uri); } } exists.close(); break; } case COMMENT: { long _id = db.insert(HNewsContract.TABLE_COMMENTS_NAME, null, values); if (_id > 0) { returnUri = HNewsContract.CommentsEntry.buildCommentUriWith(_id); } else { throw new android.database.SQLException("Failed to insert row into " + uri); } break; } case BOOKMARK: { long _id = db.insert(HNewsContract.TABLE_BOOKMARKS_NAME, null, values); if (_id > 0) { returnUri = HNewsContract.BookmarkEntry.buildBookmarksUriWith(_id); } else { throw new android.database.SQLException("Failed to insert row into " + uri); } break; } default: throw new UnsupportedOperationException("Unknown uri: " + uri); } getContext().getContentResolver().notifyChange(uri, null); return returnUri; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { final SQLiteDatabase db = mOpenHelper.getWritableDatabase(); final int match = sUriMatcher.match(uri); int rowsDeleted; switch (match) { case STORY: rowsDeleted = db.delete( HNewsContract.TABLE_ITEM_NAME, selection, selectionArgs); break; case COMMENT: rowsDeleted = db.delete( HNewsContract.TABLE_COMMENTS_NAME, selection, selectionArgs); break; case BOOKMARK: rowsDeleted = db.delete( HNewsContract.TABLE_BOOKMARKS_NAME, selection, selectionArgs); break; default: throw new UnsupportedOperationException("Unknown uri: " + uri); } if (selection == null || rowsDeleted != 0) { getContext().getContentResolver().notifyChange(uri, null); } return rowsDeleted; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { final SQLiteDatabase db = mOpenHelper.getWritableDatabase(); final int match = sUriMatcher.match(uri); int rowsUpdated; switch (match) { case STORY: rowsUpdated = db.update(HNewsContract.TABLE_ITEM_NAME, values, selection, selectionArgs); break; case COMMENT: rowsUpdated = db.update(HNewsContract.TABLE_COMMENTS_NAME, values, selection, selectionArgs); break; case BOOKMARK: rowsUpdated = db.update(HNewsContract.TABLE_BOOKMARKS_NAME, values, selection, selectionArgs); break; default: throw new UnsupportedOperationException("Unknown uri: " + uri); } if (rowsUpdated != 0) { getContext().getContentResolver().notifyChange(uri, null); } return rowsUpdated; } @Override public int bulkInsert(Uri uri, ContentValues[] values) { final SQLiteDatabase db = mOpenHelper.getWritableDatabase(); final int match = sUriMatcher.match(uri); int returnCount; switch (match) { case COMMENT: db.beginTransaction(); returnCount = 0; try { for (ContentValues value : values) { long _id = db.insert(HNewsContract.TABLE_COMMENTS_NAME, null, value); if (_id != -1) { returnCount++; } } db.setTransactionSuccessful(); } finally { db.endTransaction(); } getContext().getContentResolver().notifyChange(uri, null); return returnCount; case STORY: final String updateRows = "UPDATE " + HNewsContract.TABLE_ITEM_NAME + " SET " + HNewsContract.StoryEntry.RANK + " = 1000" + " WHERE " + HNewsContract.StoryEntry.TYPE + " = '" + values[0].get(HNewsContract.StoryEntry.TYPE) + "'"; db.execSQL(updateRows); db.beginTransaction(); returnCount = 0; try { for (ContentValues value : values) { Cursor exists = db.query(HNewsContract.TABLE_ITEM_NAME, new String[]{HNewsContract.StoryEntry.ITEM_ID}, HNewsContract.StoryEntry.ITEM_ID + " = ?", new String[]{value.getAsString(HNewsContract.StoryEntry.ITEM_ID)}, null, null, null); if (exists.moveToLast()) { long _id = db.update(HNewsContract.TABLE_ITEM_NAME, value, HNewsContract.StoryEntry.ITEM_ID + " = ?", new String[]{value.getAsString(HNewsContract.StoryEntry.ITEM_ID)}); if (_id != -1) { returnCount++; } } else { long _id = db.insert(HNewsContract.TABLE_ITEM_NAME, null, value); if (_id != -1) { returnCount++; } } exists.close(); } db.setTransactionSuccessful(); } finally { db.endTransaction(); } getContext().getContentResolver().notifyChange(uri, null); return returnCount; default: return super.bulkInsert(uri, values); } } private static UriMatcher buildUriMatcher() { final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); final String authority = HNewsContract.CONTENT_AUTHORITY; matcher.addURI(authority, HNewsContract.PATH_ITEM, STORY); matcher.addURI(authority, HNewsContract.PATH_ITEM + "/*", STORY_ITEM); matcher.addURI(authority, HNewsContract.PATH_COMMENT, COMMENT); matcher.addURI(authority, HNewsContract.PATH_BOOKMARKS, BOOKMARK); return matcher; } }