@Override
 public int bulkInsert(Uri uri, ContentValues[] values) {
   final SQLiteDatabase db = mDbHelper.getWritableDatabase();
   final int match = sUriMatcher.match(uri);
   switch (match) {
     case VERTRETUNGEN:
       db.beginTransaction();
       int returnCount = 0;
       try {
         for (ContentValues value : values) {
           long _id = db.insert(Vertretungen.TABLE_NAME, null, value);
           if (_id != -1) {
             returnCount++;
           }
         }
         db.setTransactionSuccessful();
       } finally {
         db.endTransaction();
       }
       getContext().getContentResolver().notifyChange(uri, null);
       return returnCount;
     default:
       return super.bulkInsert(uri, values);
   }
 }
  @Override
  public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
    final SQLiteDatabase db = mDbHelper.getWritableDatabase();
    final int match = sUriMatcher.match(uri);
    int rowsUpdated;

    switch (match) {
      case VERTRETUNGEN:
        rowsUpdated = db.update(Vertretungen.TABLE_NAME, values, selection, selectionArgs);
        break;
      case DAYS:
        rowsUpdated = db.update(Days.TABLE_NAME, values, selection, selectionArgs);
        break;
      case ABSENT_CLASSES:
        rowsUpdated = db.update(AbsentClasses.TABLE_NAME, values, selection, selectionArgs);
        break;
      case GENERAL_INFO:
        rowsUpdated = db.update(GeneralInfo.TABLE_NAME, values, selection, selectionArgs);
        break;
      case PERSONAL_DATA:
        rowsUpdated = db.update(PersonalData.TABLE_NAME, values, selection, selectionArgs);
        break;
      default:
        throw new UnsupportedOperationException("Unknown uri: " + uri);
    }
    if (rowsUpdated != 0) {
      getContext().getContentResolver().notifyChange(uri, null);
    }
    return rowsUpdated;
  }
  private Cursor getVertretungenByDate(Uri uri, String[] projection, String sortOrder) {
    String date = Vertretungen.getDateFromUri(uri);

    String[] selectionArgs = {date};
    String selection = sVertretungenDateSelection;
    return sVertretungenByDateQueryBuilder.query(
        mDbHelper.getReadableDatabase(),
        projection,
        selection,
        selectionArgs,
        null,
        null,
        sortOrder);
  }
  @Override
  public Uri insert(Uri uri, ContentValues values) {
    final SQLiteDatabase db = mDbHelper.getReadableDatabase();
    final int match = sUriMatcher.match(uri);

    Uri returnUri;

    switch (match) {
      case VERTRETUNGEN:
        {
          long _id = db.insert(Vertretungen.TABLE_NAME, null, values);
          if (_id > 0) {
            returnUri = VertretungsplanContract.Vertretungen.buildVertretungenUri(_id);
          } else {
            throw new SQLException("Failed to insert row into " + uri);
          }
          break;
        }
      case DAYS:
        {
          long _id = db.insert(Days.TABLE_NAME, null, values);
          if (_id > 0) {
            returnUri = Days.buildDaysUri(_id);
          } else {
            throw new SQLException("Failed to insert row into " + uri);
          }
          break;
        }
      case ABSENT_CLASSES:
        {
          long _id = db.insert(VertretungsplanContract.AbsentClasses.TABLE_NAME, null, values);
          if (_id > 0) {
            returnUri = VertretungsplanContract.AbsentClasses.buildAbsentClassesUri(_id);
          } else {
            throw new SQLException("Failed to insert row into " + uri);
          }
          break;
        }
      case GENERAL_INFO:
        {
          long _id = db.insert(VertretungsplanContract.GeneralInfo.TABLE_NAME, null, values);
          if (_id > 0) {
            returnUri = VertretungsplanContract.GeneralInfo.buildGeneralInfoUri(_id);
          } else {
            throw new SQLException("Failed to insert row into " + uri);
          }
          break;
        }
      case PERSONAL_DATA:
        {
          long _id = db.insert(PersonalData.TABLE_NAME, null, values);
          if (_id > 0) {
            returnUri = PersonalData.buildPersonalDataUri(_id);
          } else {
            throw new SQLException("Failed to insert row into " + uri);
          }
          break;
        }
      default:
        throw new UnsupportedOperationException("Unknown uri: " + uri);
    }
    getContext().getContentResolver().notifyChange(uri, null);
    return returnUri;
  }
 @Override
 public Cursor query(
     Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
   // switch on the given uri and determine what request it is. After that the database can be
   // queried accordingly
   Cursor returnCursor;
   switch (sUriMatcher.match(uri)) {
     case VERTRETUNGEN:
       {
         returnCursor =
             mDbHelper
                 .getReadableDatabase()
                 .query(
                     Vertretungen.TABLE_NAME,
                     projection,
                     selection,
                     selectionArgs,
                     null,
                     null,
                     sortOrder);
         break;
       }
     case VERTRETUNGEN_WITH_DATE:
       {
         returnCursor = getVertretungenByDate(uri, projection, sortOrder);
         break;
       }
     case VERTRETUNGEN_WITH_DATE_AND_ID:
       {
         returnCursor = getVertretungenByDateAndId(uri, projection, sortOrder);
         break;
       }
     case DAYS:
       {
         returnCursor =
             mDbHelper
                 .getReadableDatabase()
                 .query(
                     Days.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
         break;
       }
     case GENERAL_INFO:
       {
         returnCursor =
             mDbHelper
                 .getReadableDatabase()
                 .query(
                     GeneralInfo.TABLE_NAME,
                     projection,
                     selection,
                     selectionArgs,
                     null,
                     null,
                     sortOrder);
         break;
       }
     case ABSENT_CLASSES:
       {
         returnCursor =
             mDbHelper
                 .getReadableDatabase()
                 .query(
                     AbsentClasses.TABLE_NAME,
                     projection,
                     selection,
                     selectionArgs,
                     null,
                     null,
                     sortOrder);
         break;
       }
     case PERSONAL_DATA:
       {
         returnCursor =
             mDbHelper
                 .getReadableDatabase()
                 .query(
                     PersonalData.TABLE_NAME,
                     projection,
                     selection,
                     selectionArgs,
                     null,
                     null,
                     sortOrder);
         break;
       }
     default:
       throw new UnsupportedOperationException("Unknown uri: " + uri);
   }
   returnCursor.setNotificationUri(getContext().getContentResolver(), uri);
   return returnCursor;
 }