2014-12-12 2 views
0

삽입하기 전에 기존 행을 쿼리 할 때에도 SQLite는 항상 중복 행을 삽입합니다. 중복 삽입을 피하는 방법 SQLite

행을 삽입 중복을 피하기 위해, 나는
public void saveAvatars(List<Avatar> avatars) { 

    List<Avatar> validAvatars = Lists.newArrayList(); 

    // query database in case insert duplicate rows 
    for (Avatar avatar : avatars) { 
     if (!isRowDuplicate(avatar)) { 
      validAvatars.add(avatar); 
     } 
    } 

    for (Avatar avatar : validAvatars) { 
     ContentValues values = new ContentValues(); 
     values.put(AVATAR_COLUMN_SIGNATURE, avatar.getSignature()); 
     values.put(AVATAR_COLUMN_URL, avatar.getUrl()); 
     values.put(AVATAR_COLUMN_MTIME, avatar.getMtime()); 
     /*values.put(AVATAR_COLUMN_IS_DEFAULT, (avatar.isIs_default() ? 1 : 0));*/ 
     database.insert(AVATAR_TABLE_NAME, null, values); 
    } 
} 

// avoid duplicate inserting request 
private boolean isRowDuplicate(Avatar avatar) { 
    Cursor cursor = database.query(
      AVATAR_TABLE_NAME, 
      projection, 
      AVATAR_COLUMN_SIGNATURE 
      + "=? and " + AVATAR_COLUMN_URL + "=?", 
      new String[] { avatar.getSignature(), avatar.getUrl()}, 
      null, // don't group the rows 
      null, // don't filter by row groups 
      null // The sort order 
      ); 
    cursor.moveToFirst(); 
    if (cursor.moveToNext()) { 
     cursor.close(); 
     return true; 
    } 
    cursor.close(); 
    return false; 

} 

만 새로운 행을 삽입 할 수 있습니다

먼저 기존 행을 조회 그러나 문제는 내가 응용 프로그램을 실행, 모두 지우기 캐시입니다 데이터, 나는 여전히 삽입 중복 행을 찾을 수 있습니다. 나는 이것에 대해 혼란스러워했다.

자식 스레드에서 데이터베이스 작업을 호출 했으므로 멀티 스레드로 인한 문제인지 해결할 수 있는지 궁금합니다.

도움이 될 것입니다.

+1

당신이 당신의 데이터베이스를 만들 때 추가 ** UNIQUE ** 중복을 피하기 위해 키워드. 이 링크를 보시오 : https://www.sqlite.org/lang_createindex.html – JJ86

답변

1

moveToFirst() (있는 경우) 첫 번째 레코드로 이동합니다. 다음 moveToNext() 호출은 두 번째 레코드로 이동합니다 (있는 경우).

moveToFirst() 호출의 반환 값을 확인해야합니다.

그리고 대신 커서 주위 하구, 당신은 단지 직접 행을 셀 수 :

long count = DatabaseUtils.queryNumEntries(
        database, 
        AVATAR_TABLE_NAME, 
        AVATAR_COLUMN_SIGNATURE + "=? and " + 
        AVATAR_COLUMN_URL + "=?", 
        new String[] { avatar.getSignature(), avatar.getUrl()}); 
return count > 0; 
+0

그러나 여전히 내 문제에 이것을 채택하는 방법을 모르겠다. –

+0

isRowDuplicate의 코드를 이것으로 바꾼다. –

+0

나는 그것을 테스트했으며 잘 작동한다. –

관련 문제