/** * A "rescue" version of Box.removeAll() for DBs that reached their size limit. * Removes data in multiple transactions of increasing size to minimize required additional disk space. * <p> * Note that this method is not transactional, so it might fail in between, with any number of objects removed. * Thus, you should persistently track the state yourself, e.g. by setting a SharedPreferences flag to indicate * that removal is in progress. If this methods fails, you can check this flag to retry at a later point. * Only once this method succeeds, this flag should be cleared. * <p> * It's recommended to increase the max. DB size to ensure addition capacity is available for this method. */ private void removeAllMultiTx(Box box) { int removeCount = 1; Query query = box.query().build(); int opsForRemoveCount = 0; Log.i("ObjectBox", "Starting clean..."); Log.i("ObjectBox", "Initial count: " + box.count()); long removedSum = 0; while (true) { List toRemove = query.find(0, removeCount); if (toRemove.isEmpty()) { Log.i("ObjectBox", "Done, count: " + box.count()); break; } // Log.i("ObjectBox", "Before remove:\n" + CallAppApplication.boxStore.diagnose()); Collections.reverse(toRemove); box.remove(toRemove); removedSum += toRemove.size(); // Log.i("ObjectBox", "After remove:\n" + CallAppApplication.boxStore.diagnose()); opsForRemoveCount++; if (opsForRemoveCount == 4) { // Delete 4 * removeCount entities, before doubling removeCount: // 1) minimize required additional space (starting with removeCount = 1) // 2) increase likeliness that enough free pages are available as removeCount grows removeCount = Math.min(10000, removeCount * 2); opsForRemoveCount = 0; Log.i("ObjectBox", "Removed: " + removedSum); } } }