8
votes

Est-ce que ça va de compter sur un sqliteconstraint et de laisser Sqlite faire le contrôle de moi? Y a-t-il une prise?

J'ai une base de données SQLite dans Android et j'utilise un ContentProvider pour gérer les opérations, qui sont persistées à une table avec un qualificatif unique dans une colonne.

Problème:

Cependant, lorsque je insert des valeurs dupliquées dans la base de données, elle ne casse pas mon code en soi, mais cela crache toujours des milliers de personnes. de SQLITECONTAINTEXCEPTION Lignes de journalisation et à mon utilisateur qui a l'impression de polluer le journal, quelque chose de non poli. J'ai essayé d'attraper l'exception juste pour expérimenter, mais cela se connecte toujours.

question:

donc, comment faire Je me taile ces lignes de journalisation? Est-ce que même possible?

Veuillez lire le commentaire ci-dessous pour la raison de poser la question.

ERREUR:

Colonne temporelle a la contrainte unique xxx


6 commentaires

Je sens que tout cela signifie que ce que j'essaie de faire est une façon paresseuse de se remettre d'un insert dupliqué sur une contrainte unique, d'où la sensation «non polie» dans le journal. Je vais probablement mieux résoudre tout ce qui crée les entrées dupliquées (et appelez les inserts) pour commencer. Je suis tout pour la douceur. Mais cela soulève la question (à moi): pourquoi nous ne pouvons pas simplement "décharger" en toute sécurité, travailler sur le vérificateur de contrainte et laisser tomber en panne en silence? Juste au cas où nous voudrions ... peut-être que nous attendons des doublons ... Donc, rien à craindre. Peut-être que notre source de données, en dehors de notre contrôle, est défectueuse de commencer ...


Commentaire après avoir répondu: Comme je l'ai dit, j'étais paresseux à des fins, aux fins de cette question, alors que j'essayais de ne pas coder les chèques et laissez-la à SQLite vous demandant environ 1) la sécurité (concurrence), 2) l'efficacité (est SQLite meilleur / plus rapide que moi à ce sujet? Probablement) et aussi 3) pratiquement (moins de code). Cependant, certaines choses ont attiré mon esprit (le nombre de lignes insertions), donc j'ai mis en œuvre les DUPS Vérifiez-moi en plus des contraintes. Quoi qu'il en soit, j'ai fini très satisfait de mon code concernant (1). N'oubliez pas que lorsque vous lisez cette question.


Si vous n'utilisez pas Android.UtilL.Log vous-même, alors pourquoi êtes-vous préoccupé par les erreurs de journalisation de l'utilisateur?


Eh bien ... ce n'est pas en train de se connecter, mais le fait que le journal implique que je ne suis pas assez efficace. Le journal est le symptôme, pas ce que je suis inquiet.


Je vois. Vous avez dit: "À mon utilisateur qui a l'impression de polluer le journal". D'où la clarification.


Je sais, j'ai compris votre point. Les lignes de journal polluées étaient le symptôme à une certaine inefficacité, désolé si je n'étais pas clair, mais je suis content que vous compris maintenant ce que je voulais dire.


3 Réponses :


10
votes

Si vous pouvez formuler ou modifier le SQL vous-même, soit pour Insérer ou pour le tableau initial , vous pouvez utiliser Extensions de manipulation deconflics . Il y a deux options pour comment faire ceci:

  • Lorsque vous insérez, utilisez insert ou ignorez plutôt que simplement insérer . Vous pouvez également utiliser ou remplacer , ou abandonner ou l'une de plusieurs autres réactions.
  • Lorsque vous créez la table, spécifiez un sur le conflit Ignore clause de la contrainte unique . Cela causera des inserts ou des mises à jour qui violent la contrainte pour ne rien faire silencieusement.

    Je trouve l'idée d'utiliser insert ou ignorer / insérer ou remplacer pour gérer les données en double, en particulier dans des environnements simultanés, pour être très propre. Il vérifie la duplication une fois - dans la base de données - et évite les conditions de race où vous vérifiez d'abord l'existence (ce n'est certes aucun problème si un seul processus / thread accède à la base de données).

    Toutefois, si les doublons résultent d'un bogue (plutôt que des événements / actions en double que votre code ne soit tout simplement pas explicitement débliciant), cela pourrait simplement cacher le bogue plutôt que de la fixer. Le manque de délégoculation explicite, cependant, n'est pas un bug à mon avis. Donc, si le correctif est de vérifier les doublons, utilisez la base de données; Si le problème réel est qu'ils ont été générés en premier lieu (au niveau de l'application réel, pas le niveau de ligne de base de données), je rechercherais probablement ce problème.


1 commentaires

Merci, c'est exactement ce que j'avais à l'esprit. J'ai également remarqué que si j'utilise sur le conflit ignore sur le schéma de la table, sqlitedatabase.insert (chaîne, chaîne, contenus) signalera la ligne comme insère ... Soyez prudent si vous en avez besoin. Et oui, envisagez de télécharger de multiples services en téléchargement de choses, cela bénéficie également d'éviter les conditions de course. Merci.



1
votes

Oui, vous pouvez le laisser et comme vous dites que vous pourriez le réparer. À mon avis, cela dépend si les DUPS sont des événements exceptionnels ou «se produisent simplement parce que vous êtes paresseux».

Je pense que dans la principale, il coûte moins de nettoyer les données à l'entrée à un module que pour y faire face. Cependant, comment vous définissez le coût est à vous.


1 commentaires

La plupart des DUPS ne sont pas, mais certains d'entre eux pourraient être réparés par moi avant même de déclencher le téléchargeur de service. Je suis d'accord sur la vérification au point d'entrée. Cependant, je suis loin de finir le code et je posais également cela dans une perspective "quoi-si".



4
votes

Utiliser sqlitedatabase.insserTHOWROW (...)


0 commentaires