Pergunta

Para a minha aplicação, eu estou tentando adicionar entradas sem ter uma entrada duplicada, e se há uma duplicata notificar o usuário e que ele tente novamente. Usando SQLite, o que eu sei muito pouco sobre, eu tentei esses dois caminhos e quer saber qual é o melhor, mais eficiente ou uma melhor maneira de desenvolvê-lo?

Primeira maneira:

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

A segunda maneira:

    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;

A primeira forma, ou inserções ou ignora os valores, eu verifico ao fazê-lo, armazenar a linha-contagem das linhas em uma variável antes da chamada, chamada essa função, e em seguida, verificar seus resultados. Se os resultados não é maior do que era antes da chamada, a inserção foi feita ignorado, alertar o usuário com os 'valores existir' mensagem. (Muito superficial, eu sei, mas tempos desesperados pedidos de medidas desesperadas)

A segunda maneira, retorna a contagem real de linhas que correspondem aos números que eu quero loja, se o número retornado maior que 1, alertar o usuário com a mensagem 'existem valores'.

I foram indo e voltando, tentando diferentes maneiras, mas eu não sei como configurar o SQLite para ter pares único, que me foi dito seria o mais fácil. Se alguém pode corrigir qualquer uma destas formas e / ou comentário sobre eles, isso seria muito apreciada.

Graças

Foi útil?

Solução 3

Eu decidi ir com a minha segunda abordagem (veja acima)

A razão de ser desde a criação de um UNIQUE INDEX parecem não trabalho para mim e provou ser uma tarefa difícil para mim conseguir se isso era resultado do meu ou SQLite do fim.

Seu objetivo não é trivial, abordagem pode ser elementar, mas ele faz o que eu preciso fazer.

Espero que as pessoas se deparar com uma situação como esta pode ser influenciada pelas respostas à esquerda aqui e desejo que tenha mais sorte com ele do que eu tinha.

Outras dicas

Aqui está o que eu entendo que você deseja:. Para se ter uma mesa Database_Table (não o nome mais descritivo, se assim posso dizer) que nunca permitirá que a mesma latitude e longitude par a ser celebrado por duas linhas

Se estiver correta, você quer declarar ou uma primária ou UNIQUE KEY que incorpora as colunas latitude e longitude. Se você fizer isso, então qualquer tentativa de inserir o mesmo par irá lançar uma exceção, que você pode pegar e, assim, notificar o usuário. Usando esta técnica você não precisará usar a cláusula WHERE não existe (...) em sua consulta, basta fazer uma INSERIR simples e deixe SQLite alertam o usuário para uma violação de sua restrição de exclusividade.

Se a tabela já existe, a chave pode mais facilmente ser adicionado usando o comando SQL CREATE INDEX . Desde que você só pode ter uma única chave primária em qualquer tabela, se você tem uma chave primária na tabela, já que você vai precisar usar um UNIQUE KEY para esta finalidade.

A forma mais simples da instrução CREATE INDEX você usaria é:

CREATE UNIQUE INDEX lat_long_unique ON Database_Table(latitude, longitude)

Parece-me que o uso de um / lat crua longa não é uma ótima maneira de verificar se há duplicatas. Cada combinação de latitude / longitude possível usando o formato GeoPoint 1E6 do Android cobre uma área de algo menos de cinco polegadas quadradas. Este tamanho é, obviamente, diferente dependendo de onde na Terra você está em pé, mas faz uma boa regra de polegar. Portanto, você deve, pelo menos em volta de seu latitude / longitude para os dez mais próximo, cem ou mil, dependendo do tamanho da coisa que você quer medir.

Antes de armazená-lo no banco de dados:

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

Aqui está uma boa ferramenta para calcular distâncias entre lat / pontos longos na Terra:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top