중복 항목을 나타내는 결과를 생성 할 수있는 SQLITE 문은 무엇입니까? 기계적 인조 인간

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

문제

내 응용 프로그램의 경우, 중복 항목없이 항목을 추가하려고 노력하고 있으며, 중복이있는 경우 사용자에게 알리고 다시 시도하도록합니다. 내가 거의 알지 못하는 SQLITE를 사용하여, 나는이 두 가지 방법을 시도했으며 어떤 것이 더 나은 것인지, 더 효율적이거나, 그것을 개발하는 더 좋은 방법을 알고 싶어합니까?

첫 번째 방법 :

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

두 번째 방법 :

    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;

첫 번째 방법은 값을 삽입하거나 무시합니다. 그렇게함으로써 확인하고, 호의 행 카운트를 호출 전에 변수에 저장하고, 해당 기능을 호출 한 다음 결과를 확인합니다. 결과가 통화 전보다 높지 않으면 삽입물이 무시되고 '값이 존재'메시지를 사용자에게 프롬프트합니다. (매우 조잡합니다. 나는 알고 있지만 절망적 인 시간은 절망적 인 조치를 요구합니다)

두 번째 방법은 저장하려는 숫자와 일치하는 실제 행 카운트를 반환합니다. 숫자가 1보다 큰 경우 사용자에게 '값 존재'메시지가 표시됩니다.

나는 앞뒤로 나아가고 다른 방식으로 시도했지만 고유 한 쌍을 갖기 위해 SQLITE를 설정하는 방법을 모르겠습니다. 누군가가 이러한 방법 중 하나를 수정하거나 그들에 대한 의견을 수정할 수 있다면, 그것은 대단히 감사 할 것입니다.

감사

도움이 되었습니까?

해결책 3

나는 두 번째 접근 방식으로 가기로 결정했습니다 (위 참조)

a. 이후의 이유 UNIQUE INDEX 나를 위해 일하지 않는 것 같고 그것이 내 또는 sqlite의 끝에서 발생했는지 여부를 달성하기가 어려운 일로 판명되었습니다.

목적은 사소한 것이 아니며 접근은 기본적 일 수 있지만 필요한 일을합니다.

나는 이런 상황에 처한 사람들이 여기에 남겨진 답변에 영향을받을 수 있고 내가 가진 것보다 더 나은 운이 있기를 바랍니다.

다른 팁

내가 원하는 것을 이해하는 것은 다음과 같습니다. 테이블 Database_table (내가 말할 수있는 가장 설명적인 이름이 아님)을 갖는 것은 두 줄에 동일한 위도와 경도 쌍을 입력 할 수 없습니다.

올바른 경우 열 위도 및 경도를 통합하는 기본 또는 고유 키를 선언하려고합니다. 그렇게하면 동일한 쌍을 삽입하려는 시도는 예외를 던지고 사용자에게 알릴 수 있습니다. 이 기술을 사용하면 쿼리의 위치 (...) 절을 사용할 필요가 없습니다. 일반 삽입물을 수행하고 SQLITE가 독창성 제약을 위반하도록 경고하십시오.

테이블이 이미 존재하면 SQL 명령을 사용하여 키를 가장 쉽게 추가 할 수 있습니다. 인덱스를 만듭니다. 테이블에 단일 기본 키 만있을 수 있으므로 이미 테이블에 기본 키가있는 경우이 목적으로 고유 키를 사용해야합니다.

가장 간단한 형태의 Create Index 문은 다음과 같습니다.

CREATE UNIQUE INDEX lat_long_unique ON Database_Table(latitude, longitude)

원시 LAT/Long을 사용하는 것은 복제물을 확인하는 좋은 방법이 아닌 것 같습니다. Android의 Geopoint 1E6 형식을 사용한 각각의 LAT/긴 조합은 5 평방 인치 미만의 영역을 포함합니다. 물론이 크기는 지구의 위치에 따라 다르지만 꽤 좋은 규칙을 만듭니다. 따라서 측정하려는 것의 크기에 따라 최소한 LAT/Long/Long을 가장 가까운 10, 백 또는 천으로 반올림해야합니다.

데이터베이스에 저장하기 전에 :

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

다음은 지구의 LAT/긴 지점 사이의 거리를 계산하는 좋은 도구입니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top