2013-06-21 5 views
19

Ho un servizio REST che sto chiamando dalla mia app, che richiama un oggetto JSON come byte[] che viene poi trasformato in una bella raccolta nidificata di oggetti - - Tutto quel bit funziona bene. Quello che poi voglio fare è persistere questi oggetti nello storage SQLite usando OrmLite, ed è qui che le cose iniziano a scomparire, perché, come ho capito, OrmLite non persegue automaticamente gli oggetti nidificati.Salvataggio di raccolte figlio con OrmLite su Android con oggetti creati da Jackson

Per semplicità, supponiamo spellare la mia effettiva funzionalità e lasciare miei oggetti modellati semplicemente come segue:

@DatabaseTable(tableName = "parents") 
public class Parent { 

    @DatabaseField(id=true) 
    private String name; 

    @ForeignCollectionField 
    // have to use Collection here because needs to be compatible with Jackson 
    private Collection<Child> children; 

    /* Getters and setters go here */ 
} 

@DatabaseTable(tableName = "children") 
public class Child { 

    @DatabaseField(id=true) 
    private String name; 

    @DatabaseField(foreign=true) 
    private Parent parent; 

    /* Getters and setters go here */ 
} 

Succede che quando si aggiunge la creazione di un nuovo Parent oggetto nel database con la corrispondente parentDao oggetto, i bambini non vengono mantenuti insieme al genitore.

Questa è una domanda comune ed è stata sollevata prima, ci sono sicuramente altre domande su SO che sono molto simili a questo, in particolare "Saving nested foreign objects with ORMLite on Android" in risposta a cui Gray suggerisce di creare l'oggetto figlio prima del genitore che sarebbe funziona bene per creare manualmente i miei POJO.

Tuttavia, non ho ancora visto una risposta quali fattori nei casi in cui gli oggetti vengono generati da un'altra libreria (in questo caso Jackson). Senza scavare più a fondo nelle viscere di deserializzazione di Jackson (che rimuove l'intero beneficio della sua semplicità) e cercando di ottenere Jackson per creare gli oggetti figli e poi aggiungerli al genitore (a meno che mi manchi qualcosa e questo è più facile di quanto sembri?) non sembra essere una soluzione particolarmente interessante in questo caso particolare.

Allo stesso modo, ci sono altre soluzioni che comportano l'aggiunta di ulteriori annotazioni alla chiave esterna che sembrano essere adatte per lavorare con oggetti figlio singolo, ma quelle annotazioni non sono disponibili quando si lavora con @ForeignCollectionField se corrispondenti Collection s.

+0

Solo curioso di sapere come pensi che dovrebbe funzionare? Sembra eccessivo cercare sempre di creare tutti gli oggetti figlio ogni volta che si crea un oggetto genitore. – Gray

+0

Sarebbe positivo se esistesse un parametro che potrebbe essere passato all'annotazione '@ ForeignCollectionField' che specifica che gli oggetti figlio devono essere mantenuti. La soluzione "creazione di bambini prima del genitore" non funziona per la creazione di oggetti top-down come fa Jackson (a meno che non ci sia un altro modo di approcciare ciò che mi manca?) –

+0

un buon approccio è serializzare con jackson in una stringa campo (collegato) come json e memorizzare l'oggetto completo. O se vuoi eseguire query su oggetti nidificati, memorizza chiavi e oggetti separati.Se vuoi altre informazioni su quella risposta, dimmelo. Allora darò una risposta. – jeorfevre

risposta

0

Si potrebbe voler provare a utilizzare un ForeignCollection invece di una raccolta nella classe genitore.

Dal ORMLite-documentazione:

"Le collezioni straniere sostengono l'add() e rimuovere() metodi, nel qual caso saranno entrambi aggiunti o rimossi gli oggetti dalla lista interna se la raccolta è desideroso, e Le chiamate DAO saranno fatte per influenzare anche la tabella [figlio] per le raccolte avide e pigre. "

(http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_2.html#Foreign-Collection)

sulla documentazione della classe stessa Essa afferma inoltre che l'add/remove viene inoltrata al database. (http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/dao/ForeignCollection.html#add(T))

Non ho mai lavorato con questo, quindi, spero solo che la documentazione sia corretta e questo ti aiuta a risolvere il tuo problema. :-)

Problemi correlati