Frage

Für meine Anwendung, ich versuche, Einträge hinzufügen, ohne einen doppelten Eintrag hat, und wenn es ein Duplikat den Benutzer benachrichtigen, und ihn haben versuchen Sie es erneut. Mit SQLite, die ich weiß sehr wenig über, ich habe diese beiden Möglichkeiten ausprobiert und wollen wissen, was man besser, effizienter oder einen besseren Weg, es zu entwickeln?

Erste Möglichkeit:

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 + ")");

Zweiter Weg:

    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;

Der erste Weg, entweder Einlagen oder ignoriert die Werte, überprüfe ich so, indem Sie, Speichern der Zeilenanzahl der Zeilen in eine Variable vor dem Aufruf, rufen Sie diese Funktion, und dann die Ergebnisse überprüfen. Wenn die Ergebnisse nicht höher als vor dem Anruf war, wurde der Einsatz aus ignoriert, den Benutzer auffordern, mit der ‚Wert vorhanden ist‘ Nachricht. (Sehr schlampig, ich weiß, aber verzweifelte Zeiten rufen verzweifelte Maßnahmen)

Der zweite Weg, gibt die aktuelle Anzahl der Zeilen, die die Zahlen, die ich mag speichern übereinstimmen, wenn die Zahl größer als 1 zurückgeführt, fordert den Benutzer mit der ‚Wert vorhanden ist‘ Nachricht.

Ich habe hin und her gegangen, versuchen verschiedene Möglichkeiten, aber ich weiß nicht, wie SQLite einzurichten UNIQUE Paare zu haben, was mir gesagt wurde, wäre die einfachste sein. Wenn jemand auf sie eine dieser beiden Möglichkeiten und / oder Kommentar korrigieren, dass würde sehr geschätzt.

Danke

War es hilfreich?

Lösung 3

Ich habe beschlossen, mit meinem zweiten Ansatz zu gehen (siehe oben)

Grund, da die Schaffung eines UNIQUE INDEX zu sein scheinen nicht für mich zu arbeiten und erwies sich als eine schwierige Aufgabe für mich, ob das von meinem oder SQLite Ende war Ergebnis zu erreichen.

Es ist Zweck nicht trivial ist, Ansatz elementar sein kann, aber es tut, was ich brauche, es zu tun.

Ich hoffe, die Menschen zu begegnen, eine Situation wie diese durch die Antworten beeinflusst werden kann hier links ab und will sie damit mehr Glück als ich.

Andere Tipps

Hier ist, was ich verstehe, Sie wollen: Um eine Tabelle haben Database_Table (nicht die beschreibenden Namen, wenn ich so sagen darf), die nie die gleiche Breite und Länge ermöglichen Paar für zwei Zeilen eingegeben werden

.

Wenn das stimmt, möchten Sie entweder einen primären oder UNIQUE KEY erklären, dass die Spalten Breite und Länge enthält. Wenn Sie dies tun, dann jeden Versuch, das gleiche Paar INSERT eine Exception aus, die Sie fangen können und dadurch den Benutzer benachrichtigen. Mit dieser Technik werden Sie nicht brauchen die WHERE verwenden NICHT VORHANDEN (...) Klausel in der Abfrage, tun nur eine einfache INSERT und lassen Sie SQLite-Benachrichtigung an eine Verletzung Ihrer Einmaligkeit Einschränkung.

Wenn die Tabelle bereits vorhanden ist, kann der Schlüssel am einfachsten hinzugefügt werden, um den SQL-Befehl CREATE INDEX . Da Sie nur einen einzigen Primärschlüssel auf jedem Tisch haben, wenn Sie einen Primärschlüssel auf dem Tisch bereits haben, müssen Sie einen eindeutigen Schlüssel für diesen Zweck verwenden.

Die einfachste Form der Anweisung CREATE INDEX würden Sie lautet:

CREATE UNIQUE INDEX lat_long_unique ON Database_Table(latitude, longitude)

Es scheint mir, dass ein rohes lat / long verwendet, ist nicht eine gute Möglichkeit für Duplikate zu überprüfen. Jede mögliche lat / long Kombination mit Androids GeoPoint 1E6-Format umfasst eine Fläche von etwas weniger als fünf Quadratzoll. Diese Größe ist natürlich, unterschiedlich, je nachdem, wo auf der Erde Sie stehen, aber es macht eine ziemlich gute Regel-of-Daumen. So sollten Sie mindestens aufrunden Ihre lat / long auf die nächsten zehn, hundert oder tausend abhängig von der Größe der Sache, die Sie messen möchten.

Bevor Sie speichern sie in der Datenbank:

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

Hier ist ein gutes Werkzeug für die Abstände zwischen lat / long Punkten auf der Erde Berechnung:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top