2012-04-23 3 views
11

Android 프로젝트에서 ORMLite는 캐시로 작동합니다. 웹 서버에서 데이터를 다운로드하고 데이터베이스에 저장합니다. 내 개체에 createOrUpdate을 호출하지만 데이터베이스에 중복이 표시됩니다. 데이터베이스 항목은 기본 키 (단순히 자동으로 증가하는 정수)를 제외하고는 동일합니다. 제 두 번째 객체에는 아직 기본 키가 없으므로 다른 모든 필드가 동일하더라도 ORMLite는이 둘을 다른 것으로 간주합니다.createOrUpdate()는 항상 ORMLite를 사용하여 데이터베이스에 새 항목을 만듭니다.

이것이 사실인지 아는 사람이 있습니까?

답변

16

개체 에 이미의 id 필드가 설정되어 있지 않으면 createOrUpdate을 호출하면 안됩니다. ORMLite이 데이터베이스에 존재하는지 여부를 결정하는 방법은 쿼리 별 ID를 수행하는 것입니다. 코드는 다음을 수행합니다.

ID id = extractId(data); 
// assume we need to create it if there is no id <<<<<<<<<<<<<<<<<<<<<<< 
if (id == null || !idExists(id)) { 
    int numRows = create(data); 
    return new CreateOrUpdateStatus(true, false, numRows); 
} else { 
    int numRows = update(data); 
    return new CreateOrUpdateStatus(false, true, numRows); 
} 

이 부분을 설명하기 위해 javadocs를 확장합니다. 그들은 매우 약하다. 죄송합니다. 다음과 같이 업데이트했습니다 :

데이터베이스에 항목이없는 경우 만드는 편리한 방법입니다. ID는 데이터 인수에서 추출되고 ID 별 조회가 데이터베이스에서 작성됩니다. 동일한 ID를 가진 데이터베이스의 행이 있으면 데이터베이스의 모든 열이 data 매개 변수의 필드에서 업데이트됩니다. id가 null (또는 0 또는 다른 디폴트 값)이거나 데이터베이스에 존재하지 않으면 오브젝트가 데이터베이스에 작성됩니다. 이는 또한 데이터 항목에 정의 된 ID 필드가 있어야 함을 의미합니다.

+0

굉장! 이것이 행동이라고 의심하기 시작했습니다. 약간의 빛을 흘려 주셔서 감사합니다. – Quentamia

+0

사실 OP가 새로운 삽입물을 얻는 데 필요한 기본값에 대해 약간의 빛을 흘리기 위해 +1하는 동작이 필요합니다. :)! – AgentKnopf

+2

'generatedId = true' 데이터베이스 필드 주석이있는 컬럼은 어떻습니까? 또한 항상 데이터베이스에 새 항목을 만듭니다. ['Bug # 173'] (http://sourceforge.net/p/ormlite/bugs/173/)을보십시오. – user2784435

0

실제 고유 식별자에 따라 기존 항목의 ID를 수동으로 추출한 다음 update 데이터베이스를 추출해야하는 것처럼 보입니다. 고유 URL이있는 예 :

CacheItem newEntry = fetchEntry("..."); // fetch it here 
List<CacheItem> existing = mDao.queryForEq("url", newEntry.getUrl()); 
if (existing.size() > 0) { 
    int id = existing.get(0).getId(); 
    newEntry.setId(id); 
    mDao.update(newEntry); 
} else mDao.create(newEntry); 
0

정상적으로 작동하는 기본 키를 설정하십시오.

@DatabaseField (columnName = "id", uniqueIndex = true) private int id;

나를 위해 일했습니다. 예외는 백그라운드에서 발생하지만 작동합니다. D

관련 문제