diff options
Diffstat (limited to 'java/com/android/dialer/calllog/database/MutationApplier.java')
-rw-r--r-- | java/com/android/dialer/calllog/database/MutationApplier.java | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/java/com/android/dialer/calllog/database/MutationApplier.java b/java/com/android/dialer/calllog/database/MutationApplier.java index 2fb52558e..c9edd3ee1 100644 --- a/java/com/android/dialer/calllog/database/MutationApplier.java +++ b/java/com/android/dialer/calllog/database/MutationApplier.java @@ -29,11 +29,13 @@ import com.android.dialer.calllog.datasources.CallLogMutations; import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; import com.android.dialer.common.concurrent.Annotations.BackgroundExecutor; +import com.google.common.collect.Iterables; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.Map.Entry; import javax.inject.Inject; @@ -97,22 +99,27 @@ public class MutationApplier { if (!mutations.getDeletes().isEmpty()) { LogUtil.i( "MutationApplier.applyToDatabase", "deleting %d rows", mutations.getDeletes().size()); - String[] questionMarks = new String[mutations.getDeletes().size()]; - Arrays.fill(questionMarks, "?"); - String whereClause = - (AnnotatedCallLog._ID + " in (") + TextUtils.join(",", questionMarks) + ")"; + // Batch the deletes into chunks of 999, the maximum size for SQLite selection args. + Iterable<List<Long>> batches = Iterables.partition(mutations.getDeletes(), 999); + for (List<Long> idsInBatch : batches) { + String[] questionMarks = new String[idsInBatch.size()]; + Arrays.fill(questionMarks, "?"); - String[] whereArgs = new String[mutations.getDeletes().size()]; - int i = 0; - for (long id : mutations.getDeletes()) { - whereArgs[i++] = String.valueOf(id); - } + String whereClause = + (AnnotatedCallLog._ID + " in (") + TextUtils.join(",", questionMarks) + ")"; + + String[] whereArgs = new String[idsInBatch.size()]; + int i = 0; + for (long id : idsInBatch) { + whereArgs[i++] = String.valueOf(id); + } - operations.add( - ContentProviderOperation.newDelete(AnnotatedCallLog.CONTENT_URI) - .withSelection(whereClause, whereArgs) - .build()); + operations.add( + ContentProviderOperation.newDelete(AnnotatedCallLog.CONTENT_URI) + .withSelection(whereClause, whereArgs) + .build()); + } } appContext.getContentResolver().applyBatch(AnnotatedCallLogContract.AUTHORITY, operations); |