Je lis je lis Ce didacticiel sur la mise en œuvre de mon propre contenuProvide pour travailler avec SQLite. Int Le ContentProvider.Query Il y a quelques choses qui m'inquiètent. Il semble très durcolé d'une seule table (la table TODO dans le didacticiel), mais peut-être que je ne vais tout simplement pas l'obtenir? Maintenant, si je voulais interroger une autre table, disons à Nodo, comment changerais-je le contenu de contenu? P>
Devrais-je ajouter les noms de table en quelque sorte dans QueryBuilder.Settables (String Intables)? P>
Qu'en est-il du contenu_type et du contenu_item_tem_type, doit-il y en avoir un pour chaque table? P>
qui sur le TODO et TODO_ID variables et le commutateur de la méthode de la requête? P>
Il semble que j'ai besoin d'avoir beaucoup de conditions si / commutateurs pour prendre en charge plusieurs tables avec le même contenuProvider, est-ce la voie à suivre ou suis-je sur un mauvais chemin? P>
merci
Søren p>
3 Réponses :
Maintenant, si je voulais interroger une autre table, disons nodo, comment changerais-je le fichier de contenu? p>
Querifier une nouvelle table signifierait que vous devez ajouter un nouveau
URI code>, puisque le
URI code> sélectionne la source de données, similaire à l'utilisation d'une table différente. P>
Vous allez ajouter essentiellement toutes les valeurs codées en dur qui sont déjà là pour les Todos pour votre autre table. Par exemple: P>
// ------- usually the same for all private static final String AUTHORITY = "de.vogella.android.todos.contentprovider"; // ------- define some Uris private static final String PATH_TODOS = "todos"; private static final String PATH_REMINDERS = "reminders"; public static final Uri CONTENT_URI_TODOS = Uri.parse("content://" + AUTHORITY + "/" + PATH_TODOS); public static final Uri CONTENT_URI_REMINDERS = Uri.parse("content://" + AUTHORITY + "/" + PATH_REMINDERS); // ------- maybe also define CONTENT_TYPE for each // ------- setup UriMatcher private static final int TODOS = 10; private static final int TODO_ID = 20; private static final int REMINDERS = 30; private static final int REMINDERS_ID = 40; private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH); static { sURIMatcher.addURI(AUTHORITY, PATH_TODOS, TODOS); sURIMatcher.addURI(AUTHORITY, PATH_TODOS + "/#", TODO_ID); sURIMatcher.addURI(AUTHORITY, PATH_REMINDERS, REMINDERS); sURIMatcher.addURI(AUTHORITY, PATH_REMINDERS + "/#", REMINDERS_ID); } //@Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // Using SQLiteQueryBuilder instead of query() method SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); int uriType = sURIMatcher.match(uri); switch (uriType) { case TODO_ID: // Adding the ID to the original query queryBuilder.appendWhere(TodoTable.COLUMN_ID + "=" + uri.getLastPathSegment()); //$FALL-THROUGH$ case TODOS: queryBuilder.setTables(TodoTable.TABLE_TODO); break; case REMINDERS_ID: // Adding the ID to the original query queryBuilder.appendWhere(ReminderTable.COLUMN_ID + "=" + uri.getLastPathSegment()); //$FALL-THROUGH$ case REMINDERS: queryBuilder.setTables(ReminderTable.TABLE_REMINDER); break; default: throw new IllegalArgumentException("Unknown URI: " + uri); }
Bonjour, comment impliqueriez-vous la méthode DELETE dans ce cas? Peux-tu aider s'il te plait?
voici solution à votre question, à l'aide d'Urimatcher, vous pouvez implémenter plusieurs Tables dans un fournisseur de contenu. P>
Type de contenu et élément de contenu peuvent être les suivants et ils peuvent être enveloppés dans une classe distincte pour chaque table p>
`vnd.android.cursor.dir / vnd.yourownanyThing.anythingthing.tablename ' p>
Ceci définit le type de contenu général
`vnd.android.cursor.item / vnd.anthinghasabove.table '
Cela définit également le spécifique et il est constant à toute application ces chaînes (mots) vnd.android.cursor.dir et .item doit être comme ça et après / vnd. doit être comme ça p>
et dans la classe qui prolonge de contenuProvider Vous venez d'utiliser le même exemple d'Urimatcher pour cartographier les tables p> Statique publique String General_Content_type = "vnd.android.cursor.dir / vnd.myfirstapp.db.member";
String final Statique public spécifique_Content_type = "vnd.android.cursor.item / vnd.myfirstapp.db.member"; code> p>
1. SETTABLES ... Cela dépend de vos besoins si vous avez besoin de rejoindre, vous devriez, mais toujours le point 2 ... 2. Content MIME ... Oui 3. Encore une fois pour chaque table. 4. Mauvais chemin ... Non, je pense qu'un bon chemin ... Vous pouvez essayer de rechercher / écrire une sorte de générateur FX selvin.pl/autocontent.zip <= sa mine mais sa vue ne supporte pas encore que des tables