@Override
 public Cursor query(
     Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
   Log.v(TAG, "query: " + uri);
   final int match = ProviderConstants.MATCHER.match(uri);
   final SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
   switch (match) {
     case AMRevolutionContract.News.TOKEN:
       qb.setTables(AMRevolutionContract.News.PATH);
       break;
     case AMRevolutionContract.News.ITEM_TOKEN:
       qb.setTables(AMRevolutionContract.News.PATH);
       addWhereId(uri, qb);
       break;
     case AMRevolutionContract.Snippets.TOKEN:
       qb.setTables(AMRevolutionContract.Snippets.PATH);
       break;
     case AMRevolutionContract.Snippets.ITEM_TOKEN:
       qb.setTables(AMRevolutionContract.Snippets.PATH);
       addWhereId(uri, qb);
       break;
     case AMRevolutionContract.News.TIMED_TOKEN:
       qb.setTables(AMRevolutionContract.News.PATH);
       qb.appendWhere(
           AMRevolutionContract.CommonColumns.TIME_STAMP + " > " + uri.getLastPathSegment());
       break;
     case AMRevolutionContract.Snippets.TIMED_TOKEN:
       qb.setTables(AMRevolutionContract.Snippets.PATH);
       qb.appendWhere(
           AMRevolutionContract.CommonColumns.TIME_STAMP + " > " + uri.getLastPathSegment());
       break;
     case AMRevolutionStateContract.TOKEN:
       qb.setTables(AMRevolutionStateContract.PATH);
       qb.appendWhere(STATE_RECORD_MATCH);
       break;
     default:
       throw unsupportedUri(uri);
   }
   final SQLiteDatabase db = mDB.getReadableDatabase();
   final Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder);
   c.setNotificationUri(getContext().getContentResolver(), uri);
   return c;
 }