2010-08-11 6 views
0

SQLite를 기본 데이터 저장소 방법으로 사용하는 응용 프로그램을 개발하고 있습니다. 대체 엔트리 포인트를 사용하는 앱용으로 두 개의 프로세스가 실행 중입니다.다른 프로세스에서 SQLite에 액세스

두 개의 서로 다른 프로세스에서 동일한 DB에 액세스해야하지만 SQLite는 서버 DB 엔진과 같지 않으므로 한 번에 한 번만 액세스 할 수 있습니다.

다른 프로세스에서 액세스 할 때 DB를 "잠그는"방법이 있는지 알고 싶었습니다. 두 번째 프로세스가 동시에 DB에 액세스하려고 시도하면 첫 번째 프로세스가 시작될 때까지 대기합니다. 프로세스가 완료된 후 다시 액세스하려고합니다.

어떻게이 문제를 해결할 수 있습니까?

답변

4

아직 데이터베이스 액세스를 추상화 한 클래스를 만들어 RuntimeStore에 저장하십시오. SQLite와 인터페이스 할 곳은 어디서나 저장 한 GUID (RuntimeStore.get (long))를 사용하여 해당 클래스에 대한 참조를 가져오고 일반적으로 클래스를 동기화합니다 (멤버 객체 잠금, 동기화 된 메소드).

위키피디아 스타일의 싱글 톤 패턴을 사용하지 마십시오.이 플랫폼의 프로세스 전체에서 진정한 싱글 톤이 아니므로 사용하지 마십시오.

참조 :

http://www.blackberry.com/developers/docs/5.0.0api/net/rim/device/api/system/RuntimeStore.html

샘플 :

class SQLManager { 
    private static long GUID = 0xa178d3ce564cae69L; // hash of com.stackoverflow.SQLManager 

    private SQLManager() { 
     // ctor stuff here 
    } 

    public static SQLManager getInstance() { 
     RuntimeStore rs = RuntimeStore.getRuntimeStore(); 

     SQLManager instance = rs.get(GUID); 

     if (instance == null) { 
      instance = new SQLManager(); 
      rs.put(GUID, instance); 
     } 

     return instance; 
    } 
} 

당신은 여전히 ​​싱글을 사용하고 "패턴"자체하지만, 처음에 RuntimeStore에 개체 인스턴스를 저장하고 getInstance 호출을 호출 한 후 사용자가 지정한 GUID를 사용하여 RuntimeStore를 가져옵니다.

+0

Thanks Doug!, 나는 싱글 톤을위한 위키에서 기사를 읽었지만, 나에게는 새로운 용어 였지만 나는 지금 그것을 바람직하지 않다고 생각한다. 이것이 블랙 베리에서 작동하지 않는 이유는 무엇입니까? 이 기능은 Java ME에서 사용할 수 없습니까? 나는 RuntimeStore에 대해 잘 모르겠다. 몇 가지 코드 샘플이 있으면 감사 하겠지만 런타임 저장소에 대해 계속 읽습니다. 감사합니다. – Arturo

+0

그런데 SQLITE_BUSY 플래그 @ Blackberry를 사용 했습니까? 이것이 해결책 일 수 있는지 나는 확신하지 못한다. 여기에 예제가 있습니다 http://stackoverflow.com/questions/2775595/sqlite-multi-process-access – Arturo

+0

안녕하세요, RuntimeStore에 대해 읽었습니다.이 경우에는 포장해야하는 objet가 명확하지 않습니다. RuntimeStore에서. 나는 모든 DB 이벤트 (열기, 삽입, 업데이트, 생성 등)를 처리하는 SQLManager라는 클래스를 만들었습니다.이 객체를 래핑해야합니까? RuntimeStore 개념이 바람직하지 않다고 생각하지만이 경우에는 구현이 명확하지 않습니다. =/어떤 도움을 주시면 감사하겠습니다. 사전에 감사합니다 – Arturo

관련 문제