완벽하게 가능합니다. 백그라운드 스레드에서 SQLite에 대한 액세스를 직렬화하면됩니다.
내 대답은 this recent question에 내 생각에 올바른 방향으로 가리켜 야합니다.
다른 곳에서 언급했듯이 SQLite는 동시 읽기에는 좋지만 쓰기에 대해서는 데이터베이스 수준에서 잠급니다. 즉, 다른 스레드에서 읽고 쓰는 경우 SQLITE_BUSY 및 SQLITE_LOCKED 오류가 발생합니다.
이를 방지하는 가장 기본적인 방법은 디스패치 큐 또는이 액세스는 주 스레드에서 일어나고되지 않기 때문에 1의 동시성이있는 NSOperationQueue
에 (읽기 및 쓰기) 중 하나 모든 DB 액세스에는 직렬화하는 것입니다 UI가 영향을받지 않습니다.
이것은 분명히 겹쳐지는 읽기 및 쓰기를 중지하지만 동시 읽기를 중지합니다. 그것이 당신이 취할 수있는 성과에 해당하는지 아닌지는 명확하지 않습니다. 당신이 맞는 볼 그렇다면 그냥 큐에 작업을 추가 할 수 있습니다
NSOperationQueue *backgroundQueue = [[NSOperationQueue alloc] init];
[backgroundQueue setMaxConcurrentOperationCount:1];
: 상기 한 바와 같이
큐를 초기화합니다.
사용하는 쿼리를 조정하고 쿼리 계획을보고 인덱스가 필요한지 확인해 보았습니까? –
여러 번 쓸 때 트랜잭션을 사용하고 있습니까? 당신은해야합니다 - 그것은 엄청난 차이를 만듭니다. –
Frederick Cheung : 여러 번 쓰기 및 가져 오기를 사용하고 있습니다. 색인 생성이 도움이 될지 살펴 보 겠지만 삽입 할 레코드가 너무 많아 색인 생성이 도움이되지 않는다고 생각합니다. Hot Licks : 여러 번 쓸 때 트랜잭션을 수행하지 않습니다. 동일한 잠금을 사용하여 데이터베이스의 모든 쓰기 작업을 수행해야합니까? – VTS12