Android: conception SQLite one-to-many

Quelqu'un a de bons conseils sur la façon de mettre en œuvre un-à-plusieurs de cartographie pour SQLite à l'aide de ContentProvider? Si vous regardez Uri ContentProvider#insert(Uri, ContentValues) vous pouvez voir qu'il a ContentValues param qui contient les données à insérer. Le problème est que dans son implémentation actuelle ContentValues ne prend pas en charge put(String, Object) et méthode de classe est finale donc je ne peut pas le prolonger. Pourquoi c'est un problème? Voici mon dessin:

J'ai 2 tables qui sont dans l'une-à-plusieurs relations. Pour représenter ces dans le code j'ai 2 objets de modèle. 1er représente l'enregistrement principal et dispose d'un champ est une liste de 2e instances de l'objet. Maintenant, j'ai une méthode d'assistance dans le modèle d'objet #1 qui renvoie ContentValues générés à partir de l'objet courant. Il est trivial pour remplir une primitive champs avec ContentValues#put méthodes surchargées, mais je suis hors de la chance pour la liste. Donc, actuellement, depuis mon 2ème ligne du tableau est juste une seule Chaîne de valeur-je générer une Chaîne délimitée par des virgules, qui puis-je d'analyse String[] à l'intérieur de ContentProvider#insert. Qui se sent sale, peut-être que quelqu'un indicateur de la façon dont cela peut être fait en nettoyant la mode.

Voici un peu de code. D'abord à partir de la classe de modèle:

public ContentValues toContentValues() {
    ContentValues values = new ContentValues();
    values.put(ITEM_ID, itemId);
    values.put(NAME, name);
    values.put(TYPES, concat(types));
    return values;
}

private String concat(String[] values) { /* trivial */}

et voici une version allégée de ContentProvider#insert méthode

public Uri insert(Uri uri, ContentValues values) {
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    db.beginTransaction();
    try {
        // populate types
        String[] types = ((String)values.get(Offer.TYPES)).split("|");
        // we no longer need it
        values.remove(Offer.TYPES);
        // first insert row into OFFERS
        final long rowId = db.insert("offers", Offer.NAME, values);
        if (rowId > 0 && types != null) {
            // now insert all types for the row
            for (String t : types) {
                ContentValues type = new ContentValues(8);
                type.put(Offer.OFFER_ID, rowId);
                type.put(Offer.TYPE, t);
                // insert values into second table
                db.insert("types", Offer.TYPE, type);
            }
        }
        db.setTransactionSuccessful();
        return ContentUris.withAppendedId(Offer.CONTENT_URI, rowId);
    } catch (Exception e) {
        Log.e(TAG, "Failed to insert record", e);
    } finally {
        db.endTransaction();
    }

}

source d'informationauteur Bostone