AsyncQueryHandler
은 bulkInsert
을 지원하지 않습니다. 아마도이 방법은 삽입의 원 자성에 대한 보장이 없기 때문일 것입니다. 이것은 무엇을 의미 하는가? 어떤 이유로 든 startInsert
이 실패하면 삽입이 수행되지 않습니다. 즉 삽입 없음 또는 삽입 삽입 중 하나를 가질 수 있습니다. 단 두 가지 옵션이 있습니다. 원 자성이 유지된다. 즉, 실패 할 경우 기본 데이터 소스는 이전과 동일하게 유지된다.
10 개의 항목 중 bulkInsert
이 어떤 이유로 중간에 실패하면 많은 옵션이있을 수 있습니다. 3 개의 항목이 삽입되거나 5 개의 항목이 삽입됩니다. 따라서 원 자성은 없습니다. 이는 ContentProvider
이 bulkInsert
을 덮어 쓰지 않고 내재적 인 insert
을 여러 번 사용하여 끝나는 경우 발생합니다. 따라서 각 항목을 삽입 한 후에 트랜잭션은 성공한 것으로 간주되고 커밋이 수행됩니다. 이는 10 개의 항목에 대해 10 개의 트랜잭션이 발생하고 그 중 하나가 실패 할 경우 데이터 소스의 이전 상태로 롤백되지 않음을 의미합니다. 작업의 원 자성이 손실됩니다.
하지만 이것은 나쁩니다. ContentProvider
을 소유하고 있고 bulkInsert
을 재정의하고 원 자성을 유지하는 경우에는 어떻게 될까요? 그런 다음 AsyncQueryHandler
을 사용하여 bulkInsert
을 수행 할 수 있어야합니다. https://github.com/Madrapps/AsyncQuery 라이브러리가 정확히 수행합니다. Android의 AsyncQueryHandler
과 동일하지만 bulkInsert
을 지원합니다.
원어민성에 대해 걱정되는 경우 bulkInsert
을 처리 할 수있는 자신의 ContentProvider
을 사용해야합니다.
CursorLoader 문제는 삽입 및 삭제 작업을해야하는 경우입니다. 이러한 작업에는 사용할 수 없습니다. –
자세한 내용은이 링크를 참조하십시오. http://stackoverflow.com/questions/11131058/how-to-properly-insert-values-into-the-sqlite-database-using-contentproviders-i –
본 적이 있습니다. 이 대답. 사람들은 "getContentResolver(). insert (Uri, ContentValues);"를 사용하도록 지시합니다. 문제는 다음과 같습니다. 이런 종류의 삽입은 메인 스레드 UI에 있습니다. 배경 스레드에 삽입해야합니다. –