quelle instruction sqlite peut produire un résultat pour indiquer les entrées en double? Android

StackOverflow https://stackoverflow.com/questions/1634752

Question

Pour ma candidature, j'essaie d'ajouter des entrées sans doublon. S'il y en a un, avertissez l'utilisateur et demandez-lui de réessayer. En utilisant SQLite, que je connais très peu, j’ai essayé ces deux méthodes et je veux savoir laquelle est la meilleure, la plus efficace ou la meilleure façon de la développer?

Première manière:

db.execSQL("INSERT INTO " + DatabaseHelper.DATABASE_TABLE + 
"(LATITUDE, LONGITUDE, RATING) SELECT " + latitude + ", " + longitude + ", " + rating +
" WHERE NOT EXISTS (SELECT 1 FROM " + DatabaseHelper.DATABASE_TABLE +
" WHERE LATITUDE = " + latitude + " AND LONGITUDE = " + longitude + ")");

Deuxième voie:

    long id = -1;
    try {
        id = db.compileStatement(
                "SELECT COUNT(*) FROM " + DatabaseHelper.DATABASE_TABLE
                        + " WHERE LATITUDE = " + latitude
                        + " AND LONGITUDE = " + longitude)
                .simpleQueryForLong();
    } catch (NullPointerException e) {
        return -1;
    }
    return id;

La première façon, insère ou ignore les valeurs, je vérifie en enregistrant le nombre de lignes des lignes dans une variable avant l'appel, appelle cette fonction, puis vérifie ses résultats. Si le résultat n'est pas supérieur à ce qu'il était avant l'appel, si l'insertion a été ignorée, indiquez à l'utilisateur le message «Les valeurs existent». (Très bâclé, je sais, mais les temps désespérés appellent des mesures désespérées)

La deuxième façon renvoie le nombre réel de lignes qui correspondent aux nombres que je veux stocker. Si le nombre renvoyé est supérieur à 1, invite l'utilisateur avec le message "Les valeurs existent".

J’ai fait des va-et-vient, essayé différentes méthodes, mais je ne sais pas comment configurer SQLite pour avoir des paires UNIQUE, ce qui m’a été dit, c’était la solution la plus facile. Si quelqu'un pouvait corriger l'une ou l'autre de ces manières et / ou les commenter, cela serait grandement apprécié.

Merci

Était-ce utile?

La solution 3

J'ai décidé d'y aller avec ma deuxième approche (voir ci-dessus)

La raison d'être depuis la création d'un UNIQUE INDEX ne semble pas fonctionner pour moi et s'est révélée être une tâche difficile à accomplir pour moi, que ce soit le résultat de ma fin ou de celle de SQLite.

Son but n’est pas trivial, l’approche peut être élémentaire mais elle fait ce que j’ai besoin de faire.

J'espère que les personnes rencontrant une situation comme celle-ci pourront être influencées par les réponses laissées ici et qu'elles souhaitent avoir plus de chance avec elle que moi.

Autres conseils

Voici ce que je comprends vous voulez: avoir une table Database_Table (pas le nom le plus descriptif, si je puis dire) qui ne permettra jamais la même paire de latitude et de longitude à entrer pour deux lignes.

Si cela est correct, vous souhaitez déclarer une clé primaire ou unique qui intègre les colonnes latitude et longitude. Si vous le faites, toute tentative d'insertion de la même paire générera une exception que vous pourrez intercepter et informer ainsi l'utilisateur. En utilisant cette technique, vous n’aurez pas besoin de la clause WHERE NOT EXISTS (...) dans votre requête, faites simplement une INSERT simple et laissez SQLite vous avertir de la violation de votre contrainte UNIQUEness.

Si votre table existe déjà, vous pouvez facilement ajouter la clé à l'aide de la commande SQL CREATE INDEX . Étant donné que vous ne pouvez avoir qu'une seule clé primaire sur une table, si vous avez déjà une clé primaire sur la table, vous devrez utiliser une clé unique à cette fin.

La forme la plus simple de l'instruction CREATE INDEX à utiliser est la suivante:

CREATE UNIQUE INDEX lat_long_unique ON Database_Table(latitude, longitude)

Il me semble que l’utilisation d’une valeur brute lat / long n’est pas un excellent moyen de rechercher des doublons. Chaque combinaison lat / long possible utilisant le format GeoPoint 1E6 d'Android couvre une zone de moins de cinq pouces carrés. Cette taille est, bien sûr, différente selon l'endroit où vous vous trouvez sur la Terre, mais elle constitue une bonne règle empirique. Vous devez donc au moins arrondir votre lat / long au dix, cent ou mille le plus proche en fonction de la taille de la chose que vous voulez mesurer.

Avant de le stocker dans la base de données:

lat = (lat/1000)*1000; 
lon = (lon/1000)*1000;

Voici un bon outil pour calculer les distances entre les points lat / long de la Terre:

http://jan.ucc.nau.edu/~cvm/latlongdist .html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top