Pregunta

Para mi aplicación, estoy tratando de agregar entradas sin tener una entrada duplicada, y si hay una duplicada, notifique al usuario y haga que lo intente nuevamente. Usando SQLite, del cual sé muy poco, ¿he probado estas dos formas y quiero saber cuál es mejor, más eficiente o una mejor manera de desarrollarlo?

Primera forma:

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

Segunda forma:

    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 primera forma, ya sea que inserte o ignore los valores, verifico al hacerlo, almacenando el recuento de filas de las filas en una variable antes de la llamada, llamo a esa función y luego verifico sus resultados. Si los resultados no son más altos de lo que era antes de la llamada, la inserción se hizo ignorar, solicite al usuario el mensaje 'valores existen'. (Muy descuidado, lo sé, pero los tiempos desesperados requieren medidas desesperadas)

La segunda forma, devuelve el recuento real de filas que coinciden con los números que quiero almacenar, si el número devuelto es mayor que 1, solicita al usuario el mensaje 'valores existen'.

He estado yendo y viniendo, intentando de diferentes maneras, pero no sé cómo configurar SQLite para que tenga pares ÚNICOS, lo que me dijeron que sería el más fácil. Si alguien puede corregir cualquiera de estas formas y / o comentar sobre ellas, sería muy apreciado.

Gracias

¿Fue útil?

Solución 3

He decidido seguir con mi segundo enfoque (ver arriba)

La razón es que desde la creación de un ÍNDICE ÚNICO parece no funcionar para mí y resultó ser una tarea difícil de lograr para mí, ya sea el resultado de mi final o el de SQLite.

Su propósito no es trivial, el enfoque puede ser elemental pero hace lo que necesito que haga.

Espero que las personas que se encuentran con una situación como esta puedan verse influenciadas por las respuestas que se dejan aquí y deseen tener mejor suerte que yo.

Otros consejos

Esto es lo que entiendo que quiere: tener una tabla Database_Table (no el nombre más descriptivo, si puedo decirlo) que nunca permitirá que se ingrese el mismo par de latitud y longitud para dos líneas.

Si es correcto, desea declarar una CLAVE PRIMARIA o ÚNICA que incorpore las columnas latitud y longitud. Si lo hace, cualquier intento de INSERTAR el mismo par arrojará una excepción, que puede detectar y, por lo tanto, notificar al usuario. Al usar esta técnica, no necesitará usar la cláusula WHERE NOT EXISTS (...) en su consulta, solo haga un INSERT simple y deje que SQLite le avise de una violación de su restricción de UNIQUEness.

Si su tabla ya existe, la clave se puede agregar más fácilmente usando el comando SQL CREATE INDEX . Como es posible que solo tenga una CLAVE PRIMARIA en cualquier mesa, si ya tiene una CLAVE PRIMARIA en la mesa, deberá usar una TECLA ÚNICA para este propósito.

La forma más simple de la instrucción CREATE INDEX que usaría es:

CREATE UNIQUE INDEX lat_long_unique ON Database_Table(latitude, longitude)

Me parece que usar un lat / raw sin procesar no es una excelente manera de verificar si hay duplicados. Cada combinación de lat / long posible con el formato GeoPoint 1E6 de Android cubre un área de algo menos de cinco pulgadas cuadradas. Este tamaño es, por supuesto, diferente dependiendo de en qué parte de la Tierra se encuentre, pero es una regla general bastante buena. Por lo tanto, debe al menos redondear su lat / long a los diez, cien o mil más cercanos, dependiendo del tamaño de la cosa que desea medir.

Antes de almacenarlo en la base de datos:

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

Aquí hay una buena herramienta para calcular distancias entre puntos lat / long en la Tierra:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top