삽입하기 전에 기존 행을 쿼리 할 때에도 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;
}
만 새로운 행을 삽입 할 수 있습니다
먼저 기존 행을 조회 그러나 문제는 내가 응용 프로그램을 실행, 모두 지우기 캐시입니다 데이터, 나는 여전히 삽입 중복 행을 찾을 수 있습니다. 나는 이것에 대해 혼란스러워했다.자식 스레드에서 데이터베이스 작업을 호출 했으므로 멀티 스레드로 인한 문제인지 해결할 수 있는지 궁금합니다.
도움이 될 것입니다.
당신이 당신의 데이터베이스를 만들 때 추가 ** UNIQUE ** 중복을 피하기 위해 키워드. 이 링크를 보시오 : https://www.sqlite.org/lang_createindex.html – JJ86