Android ContentProvider URI scheme pour notifier CursorAdapters en écoutant les requêtes OUTER JOIN

J'ai un ContentProvider Android qui permet de faire des requêtes LEFT OUTER JOIN sur une base de données SQLite.

Supposons que dans la base de données, j'ai 3 tableaux, Users , Articles et Comments . ContentProvider ressemble à ce qui suit:

  • L'exemple le plus simple d'un fond d'écran Android en direct
  • Comment exécuter l'application Android dans la ligne de commande d'Android Studio?
  • Pourquoi Android Studio supprime-t-il et / ou change-t-il les contraintes de layout_margin *?
  • Comment puis-je accéder à une valeur BuildConfig dans mon fichier AndroidManifest.xml?
  • Utilisez ColorMatrix ou HexColor dans BlendModeFilter - Android?
  • Comment traiter le code d'erreur LicenseCheckerCallback.ERROR_NOT_MARKET_MANAGED?
  •  public class SampleContentProvider extends ContentProvider { private static final UriMatcher sUriMatcher; public static final String AUTHORITY = "com.sample.contentprovider"; private static final int USERS_TABLE = 1; private static final int USERS_TABLE_ID = 2; private static final int ARTICLES_TABLE = 3; private static final int ARTICLES_TABLE_ID = 4; private static final int COMMENTS_TABLE = 5; private static final int COMMENTS_TABLE_ID = 6; private static final int ARTICLES_USERS_JOIN_TABLE = 7; private static final int COMMENTS_USERS_JOIN_TABLE = 8; // [...] other ContentProvider methods @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { String table = getTableName(uri); // SQLiteWrapper is a wrapper class to manage a SQLiteHelper Cursor c = SQLiteWrapper.get(getContext()).getHelper().getReadableDatabase() .query(table, projection, selection, selectionArgs, null, null, sortOrder); c.setNotificationUri(getContext().getContentResolver(), uri); return c; } @Override public Uri insert(Uri uri, ContentValues values) { String table = getTableName(uri); // SQLiteWrapper is a wrapper class to manage a SQLiteHelper long id = SQLiteWrapper.get(getContext()).getHelper().getWritableDatabase() .insert(table, null, values); Uri itemUri = ContentUris.withAppendedId(uri, id); getContext().getContentResolver().notifyChange(itemUri, null); return itemUri; } private String getTableName(Uri uri) { switch (sUriMatcher.match(uri)) { case USERS_TABLE: case USERS_TABLE_ID: return "Users"; case ARTICLES_TABLE: case ARTICLES_TABLE_ID: return "Articles"; case COMMENTS_TABLE: case COMMENTS_TABLE_ID: return "Comments"; case ARTICLES_USERS_JOIN_TABLE: return "Articles a LEFT OUTER JOIN Users u ON (u._id = a.user_id)"; case COMMENTS_USERS_JOIN_TABLE: return "Comments c LEFT OUTER JOIN Users u ON (u._id = c.user_id)"; default: throw new IllegalArgumentException("Unknown URI " + uri); } } static { sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); sUriMatcher.addURI(AUTHORITY, "users", USERS_TABLE); sUriMatcher.addURI(AUTHORITY, "articles", ARTICLES_TABLE); sUriMatcher.addURI(AUTHORITY, "comments", COMMENTS_TABLE); sUriMatcher.addURI(AUTHORITY, "users" + "/#", USERS_TABLE_ID); sUriMatcher.addURI(AUTHORITY, "articles" + "/#", ARTICLES_TABLE_ID); sUriMatcher.addURI(AUTHORITY, "comments" + "/#", COMMENTS_TABLE_ID); sUriMatcher.addURI(AUTHORITY, "???", ARTICLES_USERS_JOIN_TABLE); // what uri here? sUriMatcher.addURI(AUTHORITY, "???", COMMENTS_USERS_JOIN_TABLE); // what uri here? } } 

    Quel est le meilleur schéma URI pour notifier toutes les CursorAdapter sur les requêtes jointes et non jointes chaque fois que j'insère (ou met à jour) une ligne dans la table des Users ?

    En d'autres termes, si j'ajoute ou met à jour une nouvelle ligne dans l'une des tables, je souhaite envoyer une notification unique avec getContext().getContentResolver().notifyChange(itemUri, null) afin que toutes les CursorAdapter sur n'importe quelle requête ( USERS_TABLE , ARTICLES_USERS_JOIN_TABLE , COMMENTS_USERS_JOIN_TABLE ) reçoivent une notification pour mettre à jour leur contenu.

    Si cela n'est pas possible, y at-il une autre façon d'informer tous les observateurs?

  • Impossible de dlopen (libsomething.so) Impossible de charger la bibliothèque: link_image : impossible de lier libsomething.so
  • Traitement vidéo en Android
  • Comment formater un numéro de téléphone à l'aide de PhoneNumberUtils?
  • Polices personnalisées et mises en page XML (Android)
  • Butterknife View injection
  • Supprimez l'icône de l'application et le titre de la barre d'action Honeycomb
  • 2 Solutions collect form web for “Android ContentProvider URI scheme pour notifier CursorAdapters en écoutant les requêtes OUTER JOIN”

    Vous pouvez demander à Uri spéciale de faire une requête avec:

      sUriMatcher.addURI(AUTHORITY, "articlesusers", ARTICLES_USERS_JOIN_TABLE); sUriMatcher.addURI(AUTHORITY, "commentsusers", COMMENTS_USERS_JOIN_TABLE); 

    Mais je ne peux pas penser à une façon d'envoyer une notification unique. Il semble que votre meilleur choix soit d'envoyer une notification pour chaque Uri qui fait référence à la table en cours de modification. Ainsi, vos méthodes d'insertion / mise à jour / suppression appellent notifyChange plusieurs fois en fonction de la table affectée. Pour les modifications apportées aux "utilisateurs", il s'agirait de 3 notifications: les utilisateurs, les articles d'articles et les utilisateurs de commentaires, puisqu'ils dépendent tous de la table des "utilisateurs".

    Comme répondu par prodaea , voici une autre alternative que vous pouvez utiliser pour la notification Uri. Ce n'est pas une solution parfaite, mais il utilise un seul Uri pour la notification.

    La solution consiste à utiliser l'Uri principal sans aucun nom de table (par exemple: contenu: //com.example.app.provider/) comme notification Uri dans la méthode de requête pour ARTICLES_USERS_JOIN_TABLE et COMMENTS_USERS_JOIN_TABLE . Ainsi, le curseur associé sera notifié chaque fois qu'il y a changement dans n'importe quel tableau. Il existe toutefois une limitation. C'est-à-dire que le curseur ARTICLES_USERS_JOIN_TABLE sera notifié même s'il y a changement dans le tableau Articles .

    Pour les tableaux, les Users' and articles, vous pouvez utiliser leur Uris spécifique pour la notification.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.