1

백그라운드 스레드에서 내 콘텐츠 리졸버 작업 (쿼리, 삽입, 삭제)을 실행하고 싶습니다.AsyncQueryHandler 대량 삽입

AsyncQueryHandler가 내 문제를 해결할 수 있음을 알았습니다. AsyncQueryHandler의 문제점은 대량 삽입입니다. 내 응용 프로그램에서 이러한 종류의 작업이 있고 AsyncQueryHandler 클래스에서 덮어 쓸 bulkInsert 메서드가 없습니다.

AsyncQueryHandler를 처리 할 때 어떻게 대량 삽입을 처리 할 수 ​​있습니까? AsyncQueryHandler 외에 다른 옵션이 있습니까?

답변

0

같은 콘텐츠 제공 업체에 대량 삽입 방법을 정의 할 수 있습니다, 내 아키텍처를 변경했습니다.

bulkInsert를 제거하고 Content Values ​​배열을 수정했습니다. 이 방법을 사용하면 문제없이 AsyncQueryHandler를 사용할 수 있습니다.

생각하고 생각한 후에, 나는 이것이 나를위한 최선의 선택이라고 결론을 내렸다.

1

이 경우 CursorLoader를 사용할 수 있습니다. 그러면 내용 확인자를 쿼리하고 커서를 반환합니다. AsyncTaskLoader를 사용하여 응용 프로그램의 UI를 차단하지 않도록 백그라운드 스레드에서 커서 쿼리를 수행합니다. 자세한 내용은 http://www.theappguruz.com/blog/use-android-cursorloader-example을 참조하십시오.

그리고 당신은 하루의 끝에서

아래
@Override 
public int bulkInsert(@NonNull Uri uri, @NonNull ContentValues[] values) { 
    //mOpenHelper is object of helper class. 
    final SQLiteDatabase db = mOpenHelper.getWritableDatabase(); 


      db.beginTransaction(); 
      int rowsInserted = 0; 
      try { 
       for (ContentValues value : values) { 

        long _id = db.insert(TABLE_NAME, null, value); 
        if (_id != -1) { 
         rowsInserted++; 
        } 
       } 
       db.setTransactionSuccessful(); 
      } finally { 
       db.endTransaction(); 
      } 

      if (rowsInserted > 0) { 
       getContext().getContentResolver().notifyChange(uri, null); 
      } 
      return rowsInserted; 


} 
+0

CursorLoader 문제는 삽입 및 삭제 작업을해야하는 경우입니다. 이러한 작업에는 사용할 수 없습니다. –

+0

자세한 내용은이 링크를 참조하십시오. http://stackoverflow.com/questions/11131058/how-to-properly-insert-values-into-the-sqlite-database-using-contentproviders-i –

+0

본 적이 있습니다. 이 대답. 사람들은 "getContentResolver(). insert (Uri, ContentValues);"를 사용하도록 지시합니다. 문제는 다음과 같습니다. 이런 종류의 삽입은 메인 스레드 UI에 있습니다. 배경 스레드에 삽입해야합니다. –

0

AsyncQueryHandlerbulkInsert을 지원하지 않습니다. 아마도이 방법은 삽입의 원 자성에 대한 보장이 없기 때문일 것입니다. 이것은 무엇을 의미 하는가? 어떤 이유로 든 startInsert이 실패하면 삽입이 수행되지 않습니다. 즉 삽입 없음 또는 삽입 삽입 중 하나를 가질 수 있습니다. 단 두 가지 옵션이 있습니다. 원 자성이 유지된다. 즉, 실패 할 경우 기본 데이터 소스는 이전과 동일하게 유지된다.

10 개의 항목 중 bulkInsert이 어떤 이유로 중간에 실패하면 많은 옵션이있을 수 있습니다. 3 개의 항목이 삽입되거나 5 개의 항목이 삽입됩니다. 따라서 원 자성은 없습니다. 이는 ContentProviderbulkInsert을 덮어 쓰지 않고 내재적 인 insert을 여러 번 사용하여 끝나는 경우 발생합니다. 따라서 각 항목을 삽입 한 후에 트랜잭션은 성공한 것으로 간주되고 커밋이 수행됩니다. 이는 10 개의 항목에 대해 10 개의 트랜잭션이 발생하고 그 중 하나가 실패 할 경우 데이터 소스의 이전 상태로 롤백되지 않음을 의미합니다. 작업의 원 자성이 손실됩니다.

하지만 이것은 나쁩니다. ContentProvider을 소유하고 있고 bulkInsert을 재정의하고 원 자성을 유지하는 경우에는 어떻게 될까요? 그런 다음 AsyncQueryHandler을 사용하여 bulkInsert을 수행 할 수 있어야합니다. https://github.com/Madrapps/AsyncQuery 라이브러리가 정확히 수행합니다. Android의 AsyncQueryHandler과 동일하지만 bulkInsert을 지원합니다.

원어민성에 대해 걱정되는 경우 bulkInsert을 처리 할 수있는 자신의 ContentProvider을 사용해야합니다.