SQLiteDatabase: Insérez-le uniquement si la valeur n'existe pas (pas via une commande SQL brute)

Je sais qu'il y a une commande SQL qui se présente comme suit: IF NOT EXISTS , mais puisque la classe SQLiteDatabase d'Android comporte de bonnes méthodes, je me demandais s'il était possible d'insérer une valeur s'il n'existe pas via une méthode.

Actuellement, j'utilise ceci pour insérer une String :

  • Utilisation de NanoHTTPD dans Android
  • Comment changer le nom du projet dans Android Studio
  • Comment imiter une étiquette nfc sur un téléphone Android
  • Intel HAXM 6.0.4 n'est pas compatible avec MacOS
  • Créer un VPN sur Android par programme
  • Problème Android Studio
  •  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 d' insert() , mais il semble que cela se passe comme insert() . C'est-à-dire, si la valeur est déjà dans la ligne, elle est insérée à nouveau, de sorte que la ligne possède maintenant deux valeurs de même valeur.

  • Mise en page personnalisée Android MenuItem
  • Les portions indigènes d'un paquetage réactif-natif peuvent-elles être exécutées et mises en place de manière autonome?
  • Obtenir un temps réel - Pas le temps de l'appareil programmé dans Android
  • Android essayant d'utiliser un bitmap recyclé, pas dans mon code
  • Configuration de C ++ 11 (std :: thread) pour NDK avec ADT / Eclipse
  • PopBackStack () après addToBackStack ne fonctionne pas
  • 4 Solutions collect form web for “SQLiteDatabase: Insérez-le uniquement si la valeur n'existe pas (pas via une commande SQL brute)”

    SQLiteDatabase: Insérez-le uniquement si la valeur n'existe pas (pas via une commande SQL brute)

    Comme vous ne souhaitez pas utiliser des requêtes brutes, vous pouvez l'avoir avant de l'insérer, créez simplement une fonction qui vérifiera si la valeur est déjà dans la base de données. Il pourrait renvoyer boolean (ou int) et s'il renvoie false, vous effectuerez une requête insert.

    Un petit exemple:

     public int getCount() { Cursor c = null; try { db = Dbhelper.getReadableDatabase(); String query = "select count(*) from TableName where name = ?"; c = db.rawQuery(query, new String[] {name}); if (c.moveToFirst()) { return c.getInt(0); } return 0; } finally { if (c != null) { c.close(); } if (db != null) { db.close(); } } } if (getCount() == 0) { //perform inserting } 

    Si la valeur est déjà dans la ligne, elle est de nouveau insérée, de sorte que la ligne possède maintenant deux valeurs de même valeur.

    Cela peut être résolu par une utilisation de contraintes appropriées qui ne vous permettront pas d'insérer des doublons. Vérifie ça:

    • Contraintes dans SQLite

    Vous pouvez configurer le comportement CONFLICT_IGNORE pour la ligne de conflit d'insertion:

     public long insertString(String key, String value) { ContentValues initialValues = new ContentValues(); initialValues.put(key, value); return db.insertWithOnConflict(DATABASE_TABLE, null, initialValues, SQLiteDatabase.CONFLICT_IGNORE); } 

    Mais cela dépend de la contrainte. Il y a plus de comportements si vous avez besoin à l'avenir.

    Il existe deux façons principales de faire ceci:

    1. Consulter la base de données. Vérifiez manuellement si les données existent déjà, puis l'a ajouté s'il n'existe pas.
    2. Utiliser CONSTRAINT s . Définissez votre schéma SQL pour autoriser uniquement des données uniques pour cette colonne.

    La première approche est plus facile si vous souhaitez effectuer différentes actions dans différentes circonstances (ou si vous n'êtes pas déjà compétent dans SQL). La deuxième approche peut être effectuée avec beaucoup moins de typage et peut être appliquée universellement.

    La solution n'est pas dans Android Api mais dans la base de données. Si vous souhaitez vous assurer que la chaîne que vous insérez n'est pas déjà présente dans la base de données, il existe deux solutions possibles.

    1. Lors de la création de la base de données, créez la colonne (la chaîne que vous souhaitez insérer) comme UNIQUE , cela empêchera d'entrer des doublons dans cette colonne. Et lorsque vous essayez d'insérer et est un duplicata, il provoquera une erreur; Vous pouvez le gérer via la gestion des exceptions.

    2. Vous pouvez créer une deuxième méthode (appelée après chaque insertion, c'est coûteuse) qui vérifie les doublons dans le tableau et les supprime.

    J'irais avec l'approche 1.

    Voici un exemple de syntaxe UNIQUE

    create table tablename( col1 datatype, col2 datatype, col3 datatype, UNIQUE(col1));

    bonne chance

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.