/** {@inheritDoc} */
 @Override
 public int delete(Uri uri, String selection, String[] selectionArgs) {
   if (LOGV) Log.v(TAG, "delete(uri=" + uri + ")");
   final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
   final SelectionBuilder builder = buildSimpleSelection(uri);
   int retVal = builder.where(selection, selectionArgs).delete(db);
   getContext().getContentResolver().notifyChange(uri, null);
   return retVal;
 }
  @Override
  public Cursor query(
      Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    if (LOGV) Log.v(TAG, "query(uri=" + uri + ", proj=" + Arrays.toString(projection) + ")");
    final SQLiteDatabase db = mOpenHelper.getReadableDatabase();

    final int match = sUriMatcher.match(uri);
    switch (match) {
      default:
        {
          // Most cases are handled with simple SelectionBuilder
          final SelectionBuilder builder = buildExpandedSelection(uri, match);
          return builder.where(selection, selectionArgs).query(db, projection, sortOrder);
        }
    }
  }
 /**
  * Apply the given set of {@link ContentProviderOperation}, executing inside a {@link
  * SQLiteDatabase} transaction. All changes will be rolled back if any single one fails.
  */
 @Override
 public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations)
     throws OperationApplicationException {
   final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
   db.beginTransaction();
   try {
     final int numOperations = operations.size();
     final ContentProviderResult[] results = new ContentProviderResult[numOperations];
     for (int i = 0; i < numOperations; i++) {
       results[i] = operations.get(i).apply(this, results, i);
     }
     db.setTransactionSuccessful();
     return results;
   } finally {
     db.endTransaction();
   }
 }
 @Override
 public Uri insert(Uri uri, ContentValues values) {
   if (LOGV) Log.v(TAG, "insert(uri=" + uri + ", values=" + values.toString() + ")");
   final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
   final int match = sUriMatcher.match(uri);
   switch (match) {
     case ALBUMS:
       {
         db.insertOrThrow(Tables.ALBUMS, null, values);
         getContext().getContentResolver().notifyChange(uri, null);
         return Albums.buildAlbumUri(values.getAsString(Albums.ID));
       }
     case ARTISTS:
       {
         db.insertOrThrow(Tables.ARTISTS, null, values);
         getContext().getContentResolver().notifyChange(uri, null);
         return Artists.buildArtistUri(values.getAsString(Artists.ID));
       }
     default:
       {
         throw new UnsupportedOperationException("Unknown uri: " + uri);
       }
   }
 }