Convertir ForeignCollection à ArrayList - ORMLite, Gson et Android
Je m'excuse si je ne suis pas super clair avec mon explication, mais je vais ajouter et modifier cette question pour plus de clarté, si demandé.
Je développe une application Android qui reçoit les données via une API externe et stocke les données localement à l'aide de ORMLite. Avant de stocker des données localement et à l'aide ORMLite j'ai eu des modèles qui extrait JSON à partir du serveur et analysé par:
Gson gson = new Gson();
String result = ApiClient.httpPost("/user_route");
User user = gson.fromJson(result, User.class);
L'Utilisateur de la classe a été définie
public class User {
int id;
String name;
ArrayList<Image> media;
}
Et l'Image de la classe:
public class Image {
int id;
int creator_id;
String url;
}
C'est une représentation simplifiée des modèles et des méthodes, mais je crois que j'ai gardé toutes les informations pertinentes. BTW, media
est un objet JSON qui contient le Images
.
Maintenant, je suis en train de stocker des données localement. Afin d'avoir la relation entre les Utilisateurs et les Images à l'aide de ORMLite il semble que vous avez à employer ForeignCollection classe et @ForeignCollectionField annotation. Je ne crois pas Gson pouvez directement parser le Json pour le media
champ dans la classe Utilisateur un ForeignCollection objet, alors j'ai pensé que j'avais besoin de créer deux champs mediaCollection
et media
.
À l'aide de ORMLite l'Utilisateur de la classe ressemble maintenant à ceci:
@DatabaseTable(tableName = "Users")
public class User {
@DatabaseField(generatedId = true)
int id;
@DatabaseField
String name;
@ForeignCollectionField
ForeignCollection<Image> mediaCollection;
ArrayList<Image> media;
}
L'Image de la classe avec ORMLite ressemble à ceci:
@DatabaseTable(tableName = "Images")
public class Image {
@DatabaseField(generatedId = true)
int id;
@DatabaseField(foreign=true, foreignAutoCreate=true, foreignAutoRefresh=true)
private User user;
@DatabaseField
int creator_id;
@DatabaseField
String url;
}
Comment l'écoulement de l'app est le premier que j'ai frappé la base de données locale pour l'Utilisateur. J'ai effectuer une certaine logique qui détermine ensuite si j'ai besoin de toucher le serveur à "mettre à jour" ou "actualiser" les données de l'Utilisateur.
Si les données localement ou à partir du serveur distant, j'ai besoin d'afficher la Image
dans la même vue. Aujourd'hui, l'URL de la Image
est stocké dans différents types d'objets selon que les données sont locales ou à distance. Ce que j'aimerais faire, c'est si le Image
est stocké dans un ForeginCollection
objet, convertir cet objet dans un ArrayList
et ensuite avec le reste de mon code qui extrait la Image
URL et l'affiche.
Je suppose qu'il ya deux questions.
-
Est-ce un bon plan ou devrais-je écrire de deux façons distinctes de l'extraction de la
Image
URL à partir de données, PAS de conversion de l'objet à partir deForeignCollection
àArrayList
? -
Si il est un bon plan, comment puis-je convertir un
ForeginCollection
à unArrayList
?
- voir la réponse dans un autre thread: stackoverflow.com/a/31598771/3495371
Vous devez vous connecter pour publier un commentaire.
Il devrait fonctionner. Je ne vois pas un moyen facile de faire autrement.
Certains points:
ForeignCollection
transitoire de sorte qu'il est ignoré lors du transfert de plus de JSON? Ensuite, vous pouvez utiliser le mêmeUser
objet pour les deux JSON et ORMLite.hydrate()
méthode serait bon de sorte qu'il serait de convertir demedia
->mediaCollection
et vice versa.Dao.getEmptyForeignCollect(...)
méthode. Une fois que vous avez la collecte, vous pouvez ajouter des images et ils seront ajoutés à la tableaux de.C'est plus facile. Un
ForeignCollection
est unCollection
. Il vous suffit de faire un:De sorte que votre
User.getMedia()
méthode doit vérifier lanull
et, dans l'affirmative, de convertir lesmediaCollection
champ.ForeignCollection
? Je suis en train d'essayer d'obtenir un tableau à l'aideImage[] media = mediaCollection.toArray(new Image[0])
mais ce lèvejava.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase [...]
découlant deLazyForeignCollection:232
.Juste pour Convertir
@ForeignCollectionField
àArrayList<Object>
vous pouvez le faire:
espère que c'est vous aider.
Vous ne pouvez pas créer un ForeignCollection autres que ceux de la première stocker les objets dans la base de données, puis ont ormlite les récupérer dans le ForeignCollection. Vous pouvez utiliser une Collection à la place d'un ForeignCollection, mais il fonctionne de la même manière. Ce que je fais est la suivante: j'ai deux collections dans la classe parent. L'un est une liste de tableaux que le json ou xml est désérialisé dans. Lorsque le parent de l'objet est stocké, le dao stocke les objets dans la liste de tableaux à la base de données, dans la table qui est liée à l'autre Collection, un ForeignCollection. Lorsque le parent de l'objet est récupéré, il contient automatiquement les objets dans le ForeignCollection. Il n'est pas parfait, mais il fonctionne.
ForeignCollection
à l'aide de laDao.getEmptyForeignCollection(...)
méthode. Voir ici: ormlite.com/javadoc/ormlite-core/com/j256/ormlite/dao/...