J'utilise Android avec ORMLite dans une petite application que j'écris actuellement. L'application vise à avoir une fonction d'importation/exportation, pour laquelle j'utilise un framework XML simple. Et tout fonctionne bien, jusqu'à un certain point.Puis-je suspendre temporairement l'ID généré automatiquement dans ORMLite?
La situation est la suivante: L'objet A contient une clé étrangère référençant l'objet B, qui référence l'objet C via une clé étrangère elle-même. L'exportation d'une base de données est géniale. L'importation fonctionne, avec un petit avertissement, à savoir que cela fonctionne tant que les ID de tous les objets sont séquentiels et commencent à partir de 1. Mais si la base de données est fragmentée, je supprime un enregistrement ici et là, après avoir exporté la base de données, J'ai des "trous" dans la structure XML générée. Les exemples d'objets peuvent être:
@DatabaseTable("orders")
public class Order {
@DatabaseField(generatedId = true)
private int _id;
@DatabaseField(columnName="date")
private Date _date;
@DatabaseField(columnName="cost")
private double _cost;
@DatabaseField(foreign = true, columnName="customer_id")
private Customer _customer;
// ... more fields, getters and setters
}
@DatabaseTable("customers")
public class Customer {
@DatabaseField(generatedId = true);
private int _id;
@DatabaseField
private String _name;
// ... more fields, getters and setters
}
Disons que j'ai une base de données avec 2 clients (id 1 et 2), qui détiennent respectivement des ordres de 1 à 5 et 6 à 8. L'exportation de ces puis réimporter dans un base de données propre fonctionne très bien. Si toutefois supprimer le client 1 et leurs commandes et l'exporter, l'exportateur écrire leur carte d'identité qu'ils sont, à savoir
<customer id="2">...</customer>
et
<order id="6">...</order>
<order id="7">...</order>
<order id="8">...</order>
<order id="9">...</order>
etc. Quand j'importer les données dans une nouvelle base de données , je voudrais tout d'abord enregistrer l'objet client via
custDao.create((Customer)x);
et chacun de leurs commandes via
orderDao.create((Order)o);
Le problème est que la fonction de création ne tient pas compte de l'ID fourni (qui n'est pas 0) et l'ID nouvellement généré pour le client est 1 (dans une nouvelle base de données vide). Pareil pour les commandes. Mais comme ils font référence au client avec id = 2, le lien entre eux est rompu. Donc, après cette explication un peu longue, voici ma question: Y a-t-il un moyen de dire à ORMLite de prendre la valeur fournie pour un champ generatedId et de l'exécuter, au lieu de l'écraser? Je serais OK, si une exception est générée dans le cas où la fonction create trouve une ligne déjà dans la table avec le même ID, mais continuerait à enregistrer l'enregistrement sinon ... J'ai pensé à une solution de contournement pour cela: tous les objets devraient être triables par ID en utilisant l'interface Comparator; trier ArrayList avec les objets à importer; pour chaque objet - lire l'id supposé dans un int, - sauvegarder dans la base de données en utilisant dao.create, - si le nouvel id de l'objet est différent de l'id supposé, le changer via dao.updateId, - passer à l'objet suivant dans la liste Mais cela semble trop lourd et sujet aux erreurs: que se passe-t-il si la méthode create tente de générer un identifiant, que vous venez de réattribuer à un objet précédent avec updateId?
Je ne crois pas que ma situation soit si rare, que personne ne l'ait déjà rencontré auparavant. J'apprécierais une solution!
meilleures salutations,
Je voulais juste vous assurer que vous avez vu la mise à jour de ma réponse @todor. – Gray