summaryrefslogtreecommitdiff
path: root/src/de
diff options
context:
space:
mode:
authordaniel oeh <daniel.oeh@gmail.com>2012-09-13 14:18:11 +0200
committerdaniel oeh <daniel.oeh@gmail.com>2012-09-13 14:18:11 +0200
commit71f948cafaddd8dd4f8eed00b81c034d9becedd0 (patch)
treebd6e5612c96ccf8aaf5c1a9649fcbfbcca652100 /src/de
parent33711e1657546f5478d94d5f191d958011611f74 (diff)
downloadAntennaPod-71f948cafaddd8dd4f8eed00b81c034d9becedd0.zip
Fixed crash that occured if DB had saved a very large feed
Diffstat (limited to 'src/de')
-rw-r--r--src/de/danoeh/antennapod/storage/PodDBAdapter.java54
1 files changed, 43 insertions, 11 deletions
diff --git a/src/de/danoeh/antennapod/storage/PodDBAdapter.java b/src/de/danoeh/antennapod/storage/PodDBAdapter.java
index 83301a8b4..adca2e622 100644
--- a/src/de/danoeh/antennapod/storage/PodDBAdapter.java
+++ b/src/de/danoeh/antennapod/storage/PodDBAdapter.java
@@ -1,24 +1,24 @@
package de.danoeh.antennapod.storage;
-import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
-import de.danoeh.antennapod.AppConfig;
-import de.danoeh.antennapod.asynctask.DownloadStatus;
-import de.danoeh.antennapod.feed.Feed;
-import de.danoeh.antennapod.feed.FeedCategory;
-import de.danoeh.antennapod.feed.FeedImage;
-import de.danoeh.antennapod.feed.FeedItem;
-import de.danoeh.antennapod.feed.FeedMedia;
-import de.danoeh.antennapod.feed.SimpleChapter;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
+import android.database.MergeCursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
+import de.danoeh.antennapod.AppConfig;
+import de.danoeh.antennapod.asynctask.DownloadStatus;
+import de.danoeh.antennapod.feed.Feed;
+import de.danoeh.antennapod.feed.FeedImage;
+import de.danoeh.antennapod.feed.FeedItem;
+import de.danoeh.antennapod.feed.FeedMedia;
+import de.danoeh.antennapod.feed.SimpleChapter;
/**
* Implements methods for accessing the database
@@ -28,6 +28,9 @@ public class PodDBAdapter {
private static final int DATABASE_VERSION = 5;
private static final String DATABASE_NAME = "Antennapod.db";
+ /** Maximum number of arguments for IN-operator. */
+ public static final int IN_OPERATOR_MAXIMUM = 800;
+
// ----------- Column indices
// ----------- General indices
public static final int KEY_ID_INDEX = 0;
@@ -548,8 +551,37 @@ public class PodDBAdapter {
}
public final Cursor getFeedMediaCursor(String... mediaIds) {
- return db.query(TABLE_NAME_FEED_MEDIA, null, KEY_ID + " IN "
- + buildInOperator(mediaIds.length), mediaIds, null, null, null);
+ int length = mediaIds.length;
+ if (length > IN_OPERATOR_MAXIMUM) {
+ Log.w(TAG, "Length of id array is larger than "
+ + IN_OPERATOR_MAXIMUM + ". Creating multiple cursors");
+ int numCursors = (int) (((double) length) / (IN_OPERATOR_MAXIMUM)) + 1;
+ Cursor[] cursors = new Cursor[numCursors];
+ for (int i = 0; i < numCursors; i++) {
+ int neededLength = 0;
+ String[] parts = null;
+ final int elementsLeft = length - i * IN_OPERATOR_MAXIMUM;
+
+ if (elementsLeft >= IN_OPERATOR_MAXIMUM) {
+ neededLength = IN_OPERATOR_MAXIMUM;
+ parts = Arrays.copyOfRange(mediaIds, i
+ * IN_OPERATOR_MAXIMUM, (i + 1)
+ * IN_OPERATOR_MAXIMUM);
+ } else {
+ neededLength = elementsLeft;
+ parts = Arrays.copyOfRange(mediaIds, i
+ * IN_OPERATOR_MAXIMUM, (i * IN_OPERATOR_MAXIMUM) + neededLength);
+ }
+
+ cursors[i] = db.rawQuery("SELECT * FROM "
+ + TABLE_NAME_FEED_MEDIA + " WHERE " + KEY_ID + " IN "
+ + buildInOperator(neededLength), parts);
+ }
+ return new MergeCursor(cursors);
+ } else {
+ return db.query(TABLE_NAME_FEED_MEDIA, null, KEY_ID + " IN "
+ + buildInOperator(length), mediaIds, null, null, null);
+ }
}
/** Builds an IN-operator argument depending on the number of items. */