Fixed crash that occured if DB had saved a very large feed
This commit is contained in:
parent
33711e1657
commit
71f948cafa
@ -1,24 +1,24 @@
|
|||||||
package de.danoeh.antennapod.storage;
|
package de.danoeh.antennapod.storage;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
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.ContentValues;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
|
import android.database.MergeCursor;
|
||||||
import android.database.SQLException;
|
import android.database.SQLException;
|
||||||
import android.database.sqlite.SQLiteDatabase;
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
import android.database.sqlite.SQLiteDatabase.CursorFactory;
|
import android.database.sqlite.SQLiteDatabase.CursorFactory;
|
||||||
import android.database.sqlite.SQLiteOpenHelper;
|
import android.database.sqlite.SQLiteOpenHelper;
|
||||||
import android.util.Log;
|
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
|
* Implements methods for accessing the database
|
||||||
@ -28,6 +28,9 @@ public class PodDBAdapter {
|
|||||||
private static final int DATABASE_VERSION = 5;
|
private static final int DATABASE_VERSION = 5;
|
||||||
private static final String DATABASE_NAME = "Antennapod.db";
|
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
|
// ----------- Column indices
|
||||||
// ----------- General indices
|
// ----------- General indices
|
||||||
public static final int KEY_ID_INDEX = 0;
|
public static final int KEY_ID_INDEX = 0;
|
||||||
@ -548,8 +551,37 @@ public class PodDBAdapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public final Cursor getFeedMediaCursor(String... mediaIds) {
|
public final Cursor getFeedMediaCursor(String... mediaIds) {
|
||||||
|
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 "
|
return db.query(TABLE_NAME_FEED_MEDIA, null, KEY_ID + " IN "
|
||||||
+ buildInOperator(mediaIds.length), mediaIds, null, null, null);
|
+ buildInOperator(length), mediaIds, null, null, null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Builds an IN-operator argument depending on the number of items. */
|
/** Builds an IN-operator argument depending on the number of items. */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user