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.
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
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?) –
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