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:

  • Fake Incoming Call Android
  • Le contenu EditText à l'intérieur de ExpandableListView disparaît lorsque vous cliquez sur l'en-tête ExpandableListView
  • URL SMS sur Android
  • Android Comment utiliser MediaScannerConnection scanFile
  • Existe-t-il un bon site pour suivre votre classement sur Android Market?
  • Le paramètre LOAD_NO_CACHE de WebView enregistre toujours les fichiers sur le disque?
  •  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?

  • Erreur: ANDROID_HOME n'est pas défini et la commande "Android" n'est pas dans votre PATH. Vous devez remplir au moins une de ces conditions.
  • La touche de signature en toile crée un problème dans phonegap
  • Android: disposition relative deux boutons occupent tout l'espace horizontal disponible
  • Différence entre contenu_main.xml et activity_main.xml?
  • Change Theme.Dialog pour ressembler à Theme.Light.Dialog dans Android
  • Les toasts Android simples ne s'alignent pas correctement
  • 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.