SQLiteDatabase: Insérer uniquement si la valeur n'existe pas (pas via SQL brut de commande)
Je sais qu'il y a une commande SQL qui va comme ceci: IF NOT EXISTS
, mais depuis Android SQLiteDatabase
classe a de beaux méthodes, je me demandais si il est possible d'insérer une valeur si elle n'existe pas par l'intermédiaire d'une méthode.
Actuellement, je suis en utilisant ce pour insérer un String
:
public long insertString(String key, String value) {
ContentValues initialValues = new ContentValues();
initialValues.put(key, value);
return db.insert(DATABASE_TABLE, null, initialValues);
}
(db
est une instance de SQLiteDatabase
.)
J'ai essayé la méthode insertOrThrow()
au lieu de insert()
, mais il semble qu'il fait la même chose que insert()
. Qui est, si la valeur est déjà dans la ligne, il est inséré de nouveau de sorte que la ligne a maintenant deux valeurs de la même valeur.
Pourquoi ne pas vous rendre votre clé unique?
Vous pouvez utiliser un ORM de la Bibliothèque. J'ai utilisé ORMDroid et vous pouvez faire un certain nombre de requêtes SQL par l'intermédiaire des méthodes. ormlite.com/sqlite_java_android_orm.shtml
Vous pouvez utiliser un ORM de la Bibliothèque. J'ai utilisé ORMDroid et vous pouvez faire un certain nombre de requêtes SQL par l'intermédiaire des méthodes. ormlite.com/sqlite_java_android_orm.shtml
OriginalL'auteur eightx2 | 2013-03-29
Vous devez vous connecter pour publier un commentaire.
Puisque vous ne voulez pas d'utiliser des requêtes vous pouvez obtenir ce que l'avant de l'insérer, il suffit de créer une fonction qui teste si la valeur est déjà dans la base de données. Il pourrait retourner une valeur booléenne(ou int) et si elle retourne false, vous effectuerez la requête d'insertion.
Un petit exemple:
Cela peut être résolu par l'utilisation de contraintes propres qui ne permet pas l'insertion de doublons. Vérifiez ceci:
vous êtes les bienvenus 🙂
Comment est recommandé d'utiliser les contraintes plutôt que de suivre votre posté de code sur la vérifier avant de l'insérer? J'ai été le tester contraintes et j'ai remarqué une trace de la pile d'impression sur console ne peut pas insérer en raison de la contrainte, est-ce l'effet de quelque chose? App est de ne pas tomber et n'a pas remarqué la performance de ralentir, me demandais juste.
OriginalL'auteur Simon Dorociak
Vous pouvez définir CONFLICT_IGNORE comportement de conflit d'insertion de ligne:
Mais cela dépend de la contrainte. Il n'y a plus de comportements si vous avez besoin à l'avenir.
OriginalL'auteur neworld
Il ya deux principales façons dont vous pouvez faire ceci:
CONTRAINTE
s. Définir votre schéma SQL pour autoriser uniquement les données unique pour cette colonne.La première approche est plus facile si vous souhaitez effectuer des actions différentes dans des circonstances différentes (ou si vous n'êtes pas déjà compétent en SQL.) La deuxième approche peut être fait avec beaucoup moins de frappe et peut être appliqué universellement.
OriginalL'auteur Sam
La solution n'est pas dans l'Api Android, mais dans la Base de données. si vous voulez vous assurer que la chaîne de l'insert n'est pas déjà présent dans la base de données, il y a deux solutions possibles.
lors de la création de la base de données de rendre la colonne (la chaîne qui vous vouliez insérer)
UNIQUE
, cela va les empêcher de pénétrer dans les doublons dans cette colonne. et lorsque vous essayez d'insérer et est un doublon, il lèvera une erreur; vous pouvez le gérer via la gestion des exceptions.Vous pouvez créer un deuxième méthode (appelée après chaque insertion; c'est coûteux )qui vérifie la présence de doublons dans la table et les supprime.
Je voudrais aller avec la méthode 1.
voici un exemple de
UNIQUE
syntaxecreate table tablename( col1 datatype, col2 datatype, col3 datatype, UNIQUE(col1));
bonne chance
OriginalL'auteur PK0513