11
votes

PROPRETECTEURSPROVIDER AVEC SQLITE ET TABLES MODIES

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?

Devrais-je ajouter les noms de table en quelque sorte dans QueryBuilder.Settables (String Intables)?

Qu'en est-il du contenu_type et du contenu_item_tem_type, doit-il y en avoir un pour chaque table?

qui sur le TODO et TODO_ID variables et le commutateur de la méthode de la requête?

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?

merci
Søren


1 commentaires

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


3 Réponses :


27
votes

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);
  }


1 commentaires

Bonjour, comment impliqueriez-vous la méthode DELETE dans ce cas? Peux-tu aider s'il te plait?



1
votes

voici solution à votre question, à l'aide d'Urimatcher, vous pouvez implémenter plusieurs Tables dans un fournisseur de contenu.


0 commentaires

0
votes

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

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";

`vnd.android.cursor.dir / vnd.yourownanyThing.anythingthing.tablename '

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

et dans la classe qui prolonge de contenuProvider Vous venez d'utiliser le même exemple d'Urimatcher pour cartographier les tables


0 commentaires