2012-10-22 8 views
2

ORMLite을 사용하여 내 안드로이드 애플 리케이션에서 데이터베이스를 관리하고 있으며, 꽤 잘 작동하고 있습니다. 그러나 때때로 데이터를 업데이트하려고 할 때 제약 조건을 포함하는 예외가 발생합니다. 예외는 제가 전화하는 곳을 추적하는데 도움이되었습니다 callBatchTasks().(ORMLite의) callBatchTasks는 별도의 스레드에서 실행됩니까?

실제로 그 시점에서 일련의 3 번 통화입니다. 첫 번째 호출은 Table1과 Table2를 업데이트합니다. 마지막 호출은 Table1과 Table2 간의 관계를 지정하는 데 사용되는 테이블 (Table3)을 업데이트합니다 (따라서 제약 조건도가집니다). 이것은 예외를 얻는 것입니다.

table1Dao.callBatchTasks(table1task); 
table2Dao.callBatchTasks(table2task); 
table3Dao.callBatchTasks(table3task); // Exception here 

작업에 callable이 구현되어 있으므로 각각 별도의 스레드에서 실행됩니다. 따라서 table3task가 다른 것보다 앞서 가면 제약 조건 문제가 발생합니다. 사실입니까? 그렇다면 순서대로 실행되도록 권장되는 해결 방법은 무엇입니까?

답변

3

당신의 문제를 해결 한 것처럼 들리지만 나는 더 많은 정보로 답할 것이라고 생각했습니다.

Dao.callBatchTasks(...)은 스레드와 아무런 관련이 없습니다. 모든 ORMLite 클래스의 소스는 소스 항아리 또는 온라인을 통해 사용할 수 있습니다. StatementExecutor.callBatchTasks(...)까지 호출 source for BaseDaoImpl.callBatchTasks(...) 보면, 그것은 :

  1. callbatchTasks(...)
  2. 복원 자동차에 인수로 전달되는 Callable.call() 메소드를 호출 (안드로이드 트랜잭션을 사용) 자동 위탁 해제 - 커밋 (안드로이드 거래 종료)
+1

그게 내 생각을 (내 문제를 파악한 후). 어쨌든, 응답 주셔서 감사합니다! 나는 실제로 질문에 답하기 때문에 답으로 표시하고있다. – compuguru

0

Nevermind, 문제를 발견했습니다. 실을 꿰기위한 것이었지만 내 논리에있었습니다. 동일한 업데이트 작업에 대한 두 번의 호출이 서로 바로 이루어져 스레드 2 개가 생성되었습니다. 하나는 다른 사람이 이미 가지고있는 경우 오류를 일으킨 table3에 물건을 삽입하려고합니다.

callBatchTasks이 자체 스레드에서 실행되지 않는 것 같습니다. 그 문제를 해결했을 때 오류가 해결 되었기 때문입니다.

관련 문제