diff --git a/app/src/main/java/org/tasks/data/CaldavDao.java b/app/src/main/java/org/tasks/data/CaldavDao.java index cb46447bf..311efbee0 100644 --- a/app/src/main/java/org/tasks/data/CaldavDao.java +++ b/app/src/main/java/org/tasks/data/CaldavDao.java @@ -1,6 +1,7 @@ package org.tasks.data; import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop; +import static org.tasks.db.DbUtils.collect; import androidx.lifecycle.LiveData; import androidx.room.Dao; @@ -91,8 +92,12 @@ public abstract class CaldavDao { @Query("SELECT cd_object FROM caldav_tasks WHERE cd_calendar = :calendar") public abstract List getObjects(String calendar); + public List getTasks(String calendar, List objects) { + return collect(objects, b -> getTasksInternal(calendar, b)); + } + @Query("SELECT cd_task FROM caldav_tasks WHERE cd_calendar = :calendar AND cd_object IN (:objects)") - public abstract List getTasks(String calendar, List objects); + abstract List getTasksInternal(String calendar, List objects); @Query("SELECT * FROM caldav_lists WHERE cdl_account = :account AND cdl_url NOT IN (:urls)") public abstract List findDeletedCalendars(String account, List urls); diff --git a/app/src/main/java/org/tasks/db/DbUtils.java b/app/src/main/java/org/tasks/db/DbUtils.java index acd119960..e4f05f017 100644 --- a/app/src/main/java/org/tasks/db/DbUtils.java +++ b/app/src/main/java/org/tasks/db/DbUtils.java @@ -2,13 +2,24 @@ package org.tasks.db; import static com.google.common.collect.Lists.partition; +import com.google.common.base.Function; import com.google.common.collect.Iterables; +import java.util.ArrayList; import java.util.List; import org.tasks.Callback; public class DbUtils { - private static final int MAX_SQLITE_ARGS = 999; + private static final int MAX_SQLITE_ARGS = 990; + + public static List collect(List items, Function, List> func) { + if (items.size() < MAX_SQLITE_ARGS) { + return func.apply(items); + } + List result = new ArrayList<>(); + batch(items, b -> result.addAll(func.apply(b))); + return result; + } public static void batch(List items, Callback> callback) { batch(items, MAX_SQLITE_ARGS, callback);