Domanda

Per la mia applicazione, sto provando ad aggiungere voci senza avere una voce duplicata, e se ci sono duplicati avvisa l'utente e fallo riprovare. Usando SQLite, di cui so molto poco, ho provato questi due modi e voglio sapere qual è il migliore, più efficiente o un modo migliore per svilupparlo?

Primo modo:

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

Secondo modo:

    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;

Il primo modo, inserendo o ignorando i valori, lo controllo facendo ciò, memorizzando il conteggio delle righe delle righe in una variabile prima della chiamata, chiamando quella funzione e quindi verificandone i risultati. Se i risultati non sono superiori a prima della chiamata, l'inserimento è stato ignorato, richiedere all'utente il messaggio "valori esistenti". (Molto sciatto, lo so, ma i tempi disperati richiedono misure disperate)

Il secondo modo, restituisce il conteggio effettivo delle righe che corrispondono ai numeri che voglio memorizzare, se il numero restituito maggiore di 1, richiede all'utente il messaggio "valori esistenti".

Sto andando avanti e indietro, provando modi diversi ma non so come impostare SQLite per avere coppie UNICHE, che mi è stato detto che sarebbe il più semplice. Se qualcuno può correggere uno di questi modi e / o commentarli, sarebbe molto apprezzato.

Grazie

È stato utile?

Soluzione 3

Ho deciso di seguire il mio secondo approccio (vedi sopra)

La ragione della creazione di un UNICO INDICE sembra non funzionare per me e si è rivelato un compito difficile per me realizzare se ciò fosse il risultato della mia o della fine di SQLite.

Il suo scopo non è banale, l'approccio può essere elementare ma fa quello che mi serve per farlo.

Spero che le persone che si trovano ad affrontare una situazione come questa possano essere influenzate dalle risposte lasciate qui e vorrei che avessero avuto più fortuna di me rispetto a me.

Altri suggerimenti

Ecco cosa ho capito che vuoi: avere una tabella Database_Table (non il nome più descrittivo, se così posso dire) che non consentirà mai di inserire la stessa coppia di latitudine e longitudine per due righe.

Se corretto, si desidera dichiarare un PRIMARY o UNIQUE KEY che incorpora le colonne latitudine e longitudine. In tal caso, qualsiasi tentativo di INSERIRE la stessa coppia genererà un'eccezione, che è possibile rilevare e quindi avvisare l'utente. Usando questa tecnica non avrai bisogno di usare la clausola WHERE NOT EXISTS (...) nella tua query, fai semplicemente un INSERT e lascia che SQLite ti avverta di una violazione del tuo vincolo UNIQUEness.

Se la tabella esiste già, la chiave può essere facilmente aggiunta utilizzando il comando SQL CREATE INDEX . Dato che potresti avere un solo PRIMARY KEY su qualsiasi tabella, se hai già un PRIMARY KEY sul tavolo, dovrai usare un UNIQUE KEY per questo scopo.

La forma più semplice dell'istruzione CREATE INDEX che useresti è:

CREATE UNIQUE INDEX lat_long_unique ON Database_Table(latitude, longitude)

Mi sembra che usare un lat / long non sia un ottimo modo per verificare la presenza di duplicati. Ogni possibile combinazione lat / long che utilizza il formato GeoPoint 1E6 di Android copre un'area di qualcosa di meno di cinque pollici quadrati. Questa dimensione è, ovviamente, diversa a seconda di dove ti trovi sulla Terra, ma è una buona regola empirica. Quindi dovresti almeno arrotondare il tuo lat / long ai dieci, cento o mille più vicini a seconda della dimensione della cosa che vuoi misurare.

Prima di memorizzarlo nel database:

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

Ecco un buon strumento per calcolare le distanze tra punti lat / long sulla Terra:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top