summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/calllog/database/MutationApplier.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/android/dialer/calllog/database/MutationApplier.java')
-rw-r--r--java/com/android/dialer/calllog/database/MutationApplier.java33
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);