Merge pull request #2310 from dklimkin/datareader

Some cleanup on DBReader:
This commit is contained in:
Martin Fietz 2017-04-22 18:38:20 +02:00 committed by GitHub
commit 6a30dd611a
2 changed files with 442 additions and 383 deletions

View File

@ -4,7 +4,6 @@ import android.database.Cursor;
import android.support.v4.util.ArrayMap;
import android.util.Log;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@ -66,23 +65,28 @@ public final class DBReader {
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
List<Feed> result = getFeedList(adapter);
try {
return getFeedList(adapter);
} finally {
adapter.close();
return result;
}
}
private static List<Feed> getFeedList(PodDBAdapter adapter) {
Cursor feedlistCursor = adapter.getAllFeedsCursor();
List<Feed> feeds = new ArrayList<>(feedlistCursor.getCount());
if (feedlistCursor.moveToFirst()) {
do {
Feed feed = extractFeedFromCursorRow(adapter, feedlistCursor);
Cursor cursor = null;
try {
cursor = adapter.getAllFeedsCursor();
List<Feed> feeds = new ArrayList<>(cursor.getCount());
while (cursor.moveToNext()) {
Feed feed = extractFeedFromCursorRow(adapter, cursor);
feeds.add(feed);
} while (feedlistCursor.moveToNext());
}
feedlistCursor.close();
return feeds;
} finally {
if (cursor != null) {
cursor.close();
}
}
}
/**
@ -92,23 +96,26 @@ public final class DBReader {
*/
public static List<String> getFeedListDownloadUrls() {
PodDBAdapter adapter = PodDBAdapter.getInstance();
List<String> result = new ArrayList<>();
adapter.open();
Cursor feeds = adapter.getFeedCursorDownloadUrls();
if (feeds.moveToFirst()) {
do {
result.add(feeds.getString(1));
} while (feeds.moveToNext());
Cursor cursor = null;
try {
cursor = adapter.getFeedCursorDownloadUrls();
List<String> result = new ArrayList<>(cursor.getCount());
while (cursor.moveToNext()) {
result.add(cursor.getString(1));
}
feeds.close();
adapter.close();
return result;
} finally {
if (cursor != null) {
cursor.close();
}
adapter.close();
}
}
/**
* Loads additional data in to the feed items from other database queries
*
* @param items the FeedItems who should have other data loaded
*/
public static void loadAdditionalFeedItemListData(List<FeedItem> items) {
@ -139,16 +146,17 @@ public final class DBReader {
*/
public static void loadFeedDataOfFeedItemList(List<FeedItem> items) {
List<Feed> feeds = getFeedList();
for (FeedItem item : items) {
Map<Long, Feed> feedIndex = new ArrayMap<>(feeds.size());
for (Feed feed : feeds) {
if (feed.getId() == item.getFeedId()) {
item.setFeed(feed);
break;
feedIndex.put(feed.getId(), feed);
}
}
if (item.getFeed() == null) {
for (FeedItem item : items) {
Feed feed = feedIndex.get(item.getFeedId());
if (feed == null) {
Log.w(TAG, "No match found for item with ID " + item.getId() + ". Feed ID was " + item.getFeedId());
}
item.setFeed(feed);
}
}
@ -165,33 +173,35 @@ public final class DBReader {
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
Cursor itemlistCursor = adapter.getAllItemsOfFeedCursor(feed);
List<FeedItem> items = extractItemlistFromCursor(adapter,
itemlistCursor);
itemlistCursor.close();
adapter.close();
Cursor cursor = null;
try {
cursor = adapter.getAllItemsOfFeedCursor(feed);
List<FeedItem> items = extractItemlistFromCursor(adapter, cursor);
Collections.sort(items, new FeedItemPubdateComparator());
for (FeedItem item : items) {
item.setFeed(feed);
}
return items;
} finally {
if (cursor != null) {
cursor.close();
}
adapter.close();
}
}
public static List<FeedItem> extractItemlistFromCursor(Cursor itemlistCursor) {
Log.d(TAG, "extractItemlistFromCursor() called with: " + "itemlistCursor = [" + itemlistCursor + "]");
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
List<FeedItem> result = extractItemlistFromCursor(adapter, itemlistCursor);
try {
return extractItemlistFromCursor(adapter, itemlistCursor);
} finally {
adapter.close();
return result;
}
}
private static List<FeedItem> extractItemlistFromCursor(PodDBAdapter adapter,
Cursor cursor) {
private static List<FeedItem> extractItemlistFromCursor(PodDBAdapter adapter, Cursor cursor) {
List<FeedItem> result = new ArrayList<>(cursor.getCount());
LongList imageIds = new LongList(cursor.getCount());
@ -207,7 +217,7 @@ public final class DBReader {
itemIds.add(item.getId());
} while (cursor.moveToNext());
Map<Long, FeedImage> images = getFeedImages(adapter, imageIds.toArray());
Map<Long,FeedMedia> medias = getFeedMedia(adapter, itemIds.toArray());
Map<Long, FeedMedia> medias = getFeedMedia(adapter, itemIds);
for (int i = 0; i < result.size(); i++) {
FeedItem item = result.get(i);
long imageId = imageIds.get(i);
@ -223,15 +233,14 @@ public final class DBReader {
return result;
}
private static Map<Long,FeedMedia> getFeedMedia(PodDBAdapter adapter,
long... itemIds) {
String[] ids = new String[itemIds.length];
for(int i=0, len=itemIds.length; i < len; i++) {
ids[i] = String.valueOf(itemIds[i]);
private static Map<Long, FeedMedia> getFeedMedia(PodDBAdapter adapter, LongList itemIds) {
List<String> ids = new ArrayList<>(itemIds.size());
for (long item : itemIds.toArray()) {
ids.add(String.valueOf(item));
}
Map<Long,FeedMedia> result = new ArrayMap<>(itemIds.length);
Cursor cursor = adapter.getFeedMediaCursor(ids);
Map<Long, FeedMedia> result = new ArrayMap<>(itemIds.size());
Cursor cursor = adapter.getFeedMediaCursor(ids.toArray(new String[0]));
try {
if (cursor.moveToFirst()) {
do {
@ -247,8 +256,7 @@ public final class DBReader {
return result;
}
private static Feed extractFeedFromCursorRow(PodDBAdapter adapter,
Cursor cursor) {
private static Feed extractFeedFromCursorRow(PodDBAdapter adapter, Cursor cursor) {
final FeedImage image;
int indexImage = cursor.getColumnIndex(PodDBAdapter.KEY_IMAGE);
long imageId = cursor.getLong(indexImage);
@ -272,11 +280,17 @@ public final class DBReader {
static List<FeedItem> getQueue(PodDBAdapter adapter) {
Log.d(TAG, "getQueue()");
Cursor itemlistCursor = adapter.getQueueCursor();
List<FeedItem> items = extractItemlistFromCursor(adapter, itemlistCursor);
itemlistCursor.close();
Cursor cursor = null;
try {
cursor = adapter.getQueueCursor();
List<FeedItem> items = extractItemlistFromCursor(adapter, cursor);
loadAdditionalFeedItemListData(items);
return items;
} finally {
if (cursor != null) {
cursor.close();
}
}
}
/**
@ -290,22 +304,27 @@ public final class DBReader {
Log.d(TAG, "getQueueIDList() called");
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
LongList result = getQueueIDList(adapter);
try {
return getQueueIDList(adapter);
} finally {
adapter.close();
return result;
}
}
static LongList getQueueIDList(PodDBAdapter adapter) {
Cursor queueCursor = adapter.getQueueIDCursor();
LongList queueIds = new LongList(queueCursor.getCount());
if (queueCursor.moveToFirst()) {
do {
queueIds.add(queueCursor.getLong(0));
} while (queueCursor.moveToNext());
private static LongList getQueueIDList(PodDBAdapter adapter) {
Cursor cursor = null;
try {
cursor = adapter.getQueueIDCursor();
LongList queueIds = new LongList(cursor.getCount());
while (cursor.moveToNext()) {
queueIds.add(cursor.getLong(0));
}
queueCursor.close();
return queueIds;
} finally {
if (cursor != null) {
cursor.close();
}
}
}
/**
@ -316,13 +335,15 @@ public final class DBReader {
* list in a {@link de.danoeh.antennapod.core.util.QueueAccess} object for easier access to the queue's properties.
*/
public static List<FeedItem> getQueue() {
Log.d(TAG, "getQueue() called with: " + "");
Log.d(TAG, "getQueue() called");
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
List<FeedItem> items = getQueue(adapter);
try {
return getQueue(adapter);
} finally {
adapter.close();
return items;
}
}
/**
@ -331,22 +352,23 @@ public final class DBReader {
* @return A list of FeedItems whose episdoe has been downloaded.
*/
public static List<FeedItem> getDownloadedItems() {
Log.d(TAG, "getDownloadedItems() called with: " + "");
Log.d(TAG, "getDownloadedItems() called");
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
Cursor itemlistCursor = adapter.getDownloadedItemsCursor();
List<FeedItem> items = extractItemlistFromCursor(adapter,
itemlistCursor);
itemlistCursor.close();
Cursor cursor = null;
try {
cursor = adapter.getDownloadedItemsCursor();
List<FeedItem> items = extractItemlistFromCursor(adapter, cursor);
loadAdditionalFeedItemListData(items);
adapter.close();
Collections.sort(items, new FeedItemPubdateComparator());
return items;
} finally {
if (cursor != null) {
cursor.close();
}
adapter.close();
}
}
/**
@ -359,20 +381,24 @@ public final class DBReader {
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
Cursor itemlistCursor = adapter.getUnreadItemsCursor();
List<FeedItem> items = extractItemlistFromCursor(adapter, itemlistCursor);
itemlistCursor.close();
Cursor cursor = null;
try {
cursor = adapter.getUnreadItemsCursor();
List<FeedItem> items = extractItemlistFromCursor(adapter, cursor);
loadAdditionalFeedItemListData(items);
adapter.close();
return items;
} finally {
if (cursor != null) {
cursor.close();
}
adapter.close();
}
}
/**
* Loads a list of FeedItems that are considered new.
* Excludes items from feeds that do not have keep updated enabled.
*
* @return A list of FeedItems that are considered new.
*/
public static List<FeedItem> getNewItemsList() {
@ -380,16 +406,18 @@ public final class DBReader {
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
Cursor itemlistCursor = adapter.getNewItemsCursor();
List<FeedItem> items = extractItemlistFromCursor(adapter, itemlistCursor);
itemlistCursor.close();
Cursor cursor = null;
try {
cursor = adapter.getNewItemsCursor();
List<FeedItem> items = extractItemlistFromCursor(adapter, cursor);
loadAdditionalFeedItemListData(items);
adapter.close();
return items;
} finally {
if (cursor != null) {
cursor.close();
}
adapter.close();
}
}
public static List<FeedItem> getFavoriteItemsList() {
@ -397,33 +425,39 @@ public final class DBReader {
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
Cursor itemlistCursor = adapter.getFavoritesCursor();
List<FeedItem> items = extractItemlistFromCursor(adapter, itemlistCursor);
itemlistCursor.close();
Cursor cursor = null;
try {
cursor = adapter.getFavoritesCursor();
List<FeedItem> items = extractItemlistFromCursor(adapter, cursor);
loadAdditionalFeedItemListData(items);
adapter.close();
return items;
} finally {
if (cursor != null) {
cursor.close();
}
adapter.close();
}
}
public static LongList getFavoriteIDList() {
Log.d(TAG, "getFavoriteIDList() called");
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
Cursor favoritesCursor = adapter.getFavoritesCursor();
LongList favoriteIDs = new LongList(favoritesCursor.getCount());
if (favoritesCursor.moveToFirst()) {
do {
favoriteIDs.add(favoritesCursor.getLong(0));
} while (favoritesCursor.moveToNext());
Cursor cursor = null;
try {
cursor = adapter.getFavoritesCursor();
LongList favoriteIDs = new LongList(cursor.getCount());
while (cursor.moveToNext()) {
favoriteIDs.add(cursor.getLong(0));
}
favoritesCursor.close();
adapter.close();
return favoriteIDs;
} finally {
if (cursor != null) {
cursor.close();
}
adapter.close();
}
}
/**
@ -436,16 +470,18 @@ public final class DBReader {
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
Cursor itemlistCursor = adapter.getRecentlyPublishedItemsCursor(limit);
List<FeedItem> items = extractItemlistFromCursor(adapter, itemlistCursor);
itemlistCursor.close();
Cursor cursor = null;
try {
cursor = adapter.getRecentlyPublishedItemsCursor(limit);
List<FeedItem> items = extractItemlistFromCursor(adapter, cursor);
loadAdditionalFeedItemListData(items);
adapter.close();
return items;
} finally {
if (cursor != null) {
cursor.close();
}
adapter.close();
}
}
/**
@ -461,21 +497,29 @@ public final class DBReader {
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
Cursor mediaCursor = adapter.getCompletedMediaCursor(PLAYBACK_HISTORY_SIZE);
Cursor mediaCursor = null;
Cursor itemCursor = null;
try {
mediaCursor = adapter.getCompletedMediaCursor(PLAYBACK_HISTORY_SIZE);
String[] itemIds = new String[mediaCursor.getCount()];
for (int i = 0; i < itemIds.length && mediaCursor.moveToPosition(i); i++) {
int index = mediaCursor.getColumnIndex(PodDBAdapter.KEY_FEEDITEM);
itemIds[i] = Long.toString(mediaCursor.getLong(index));
}
mediaCursor.close();
Cursor itemCursor = adapter.getFeedItemCursor(itemIds);
itemCursor = adapter.getFeedItemCursor(itemIds);
List<FeedItem> items = extractItemlistFromCursor(adapter, itemCursor);
loadAdditionalFeedItemListData(items);
itemCursor.close();
adapter.close();
Collections.sort(items, new PlaybackCompletionDateComparator());
return items;
} finally {
if (mediaCursor != null) {
mediaCursor.close();
}
if (itemCursor != null) {
itemCursor.close();
}
adapter.close();
}
}
/**
@ -489,19 +533,21 @@ public final class DBReader {
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
Cursor logCursor = adapter.getDownloadLogCursor(DOWNLOAD_LOG_SIZE);
List<DownloadStatus> downloadLog = new ArrayList<>(logCursor.getCount());
if (logCursor.moveToFirst()) {
do {
DownloadStatus status = DownloadStatus.fromCursor(logCursor);
downloadLog.add(status);
} while (logCursor.moveToNext());
Cursor cursor = null;
try {
cursor = adapter.getDownloadLogCursor(DOWNLOAD_LOG_SIZE);
List<DownloadStatus> downloadLog = new ArrayList<>(cursor.getCount());
while (cursor.moveToNext()) {
downloadLog.add(DownloadStatus.fromCursor(cursor));
}
logCursor.close();
adapter.close();
Collections.sort(downloadLog, new DownloadStatusComparator());
return downloadLog;
} finally {
if (cursor != null) {
cursor.close();
}
adapter.close();
}
}
/**
@ -516,19 +562,21 @@ public final class DBReader {
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
Cursor cursor = adapter.getDownloadLog(Feed.FEEDFILETYPE_FEED, feed.getId());
Cursor cursor = null;
try {
cursor = adapter.getDownloadLog(Feed.FEEDFILETYPE_FEED, feed.getId());
List<DownloadStatus> downloadLog = new ArrayList<>(cursor.getCount());
if (cursor.moveToFirst()) {
do {
DownloadStatus status = DownloadStatus.fromCursor(cursor);
downloadLog.add(status);
} while (cursor.moveToNext());
while (cursor.moveToNext()) {
downloadLog.add(DownloadStatus.fromCursor(cursor));
}
cursor.close();
adapter.close();
Collections.sort(downloadLog, new DownloadStatusComparator());
return downloadLog;
} finally {
if (cursor != null) {
cursor.close();
}
adapter.close();
}
}
/**
@ -542,18 +590,21 @@ public final class DBReader {
Log.d(TAG, "getFeedStatisticsList() called");
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
List<FeedItemStatistics> result = new ArrayList<>();
Cursor cursor = adapter.getFeedStatisticsCursor();
if (cursor.moveToFirst()) {
do {
Cursor cursor = null;
try {
cursor = adapter.getFeedStatisticsCursor();
List<FeedItemStatistics> result = new ArrayList<>(cursor.getCount());
while (cursor.moveToNext()) {
FeedItemStatistics fis = FeedItemStatistics.fromCursor(cursor);
result.add(fis);
} while (cursor.moveToNext());
}
cursor.close();
adapter.close();
return result;
} finally {
if (cursor != null) {
cursor.close();
}
adapter.close();
}
}
/**
@ -565,73 +616,58 @@ public final class DBReader {
*/
public static Feed getFeed(final long feedId) {
Log.d(TAG, "getFeed() called with: " + "feedId = [" + feedId + "]");
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
Feed result = getFeed(feedId, adapter);
try {
return getFeed(feedId, adapter);
} finally {
adapter.close();
return result;
}
}
static Feed getFeed(final long feedId, PodDBAdapter adapter) {
Feed feed = null;
Cursor feedCursor = adapter.getFeedCursor(feedId);
if (feedCursor.moveToFirst()) {
feed = extractFeedFromCursorRow(adapter, feedCursor);
Cursor cursor = null;
try {
cursor = adapter.getFeedCursor(feedId);
if (cursor.moveToNext()) {
feed = extractFeedFromCursorRow(adapter, cursor);
feed.setItems(getFeedItemList(feed));
} else {
Log.e(TAG, "getFeed could not find feed with id " + feedId);
}
feedCursor.close();
return feed;
} finally {
if (cursor != null) {
cursor.close();
}
}
}
static FeedItem getFeedItem(final long itemId, PodDBAdapter adapter) {
private static FeedItem getFeedItem(final long itemId, PodDBAdapter adapter) {
Log.d(TAG, "Loading feeditem with id " + itemId);
FeedItem item = null;
Cursor itemCursor = adapter.getFeedItemCursor(Long.toString(itemId));
if (!itemCursor.moveToFirst()) {
itemCursor.close();
return null;
}
List<FeedItem> list = extractItemlistFromCursor(adapter, itemCursor);
itemCursor.close();
if (list.size() > 0) {
FeedItem item = null;
Cursor cursor = null;
try {
cursor = adapter.getFeedItemCursor(Long.toString(itemId));
if (cursor.moveToNext()) {
List<FeedItem> list = extractItemlistFromCursor(adapter, cursor);
if (!list.isEmpty()) {
item = list.get(0);
loadAdditionalFeedItemListData(list);
if (item.hasChapters()) {
loadChaptersOfFeedItem(adapter, item);
}
}
}
return item;
}
static List<FeedItem> getFeedItems(PodDBAdapter adapter, final long... itemIds) {
String[] ids = new String[itemIds.length];
for(int i = 0; i < itemIds.length; i++) {
long itemId = itemIds[i];
ids[i] = Long.toString(itemId);
}
List<FeedItem> result;
Cursor itemCursor = adapter.getFeedItemCursor(ids);
if (itemCursor.moveToFirst()) {
result = extractItemlistFromCursor(adapter, itemCursor);
loadAdditionalFeedItemListData(result);
for(FeedItem item : result) {
if (item.hasChapters()) {
loadChaptersOfFeedItem(adapter, item);
} finally {
if (cursor != null) {
cursor.close();
}
}
} else {
result = Collections.emptyList();
}
itemCursor.close();
return result;
}
/**
@ -647,46 +683,37 @@ public final class DBReader {
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
FeedItem item = getFeedItem(itemId, adapter);
try {
return getFeedItem(itemId, adapter);
} finally {
adapter.close();
return item;
}
}
static FeedItem getFeedItem(final String podcastUrl, final String episodeUrl, PodDBAdapter adapter) {
Log.d(TAG, "Loading feeditem with podcast url " + podcastUrl + " and episode url " + episodeUrl);
Cursor cursor = null;
try {
cursor = adapter.getFeedItemCursor(podcastUrl, episodeUrl);
if (!cursor.moveToNext()) {
return null;
}
List<FeedItem> list = extractItemlistFromCursor(adapter, cursor);
FeedItem item = null;
Cursor itemCursor = adapter.getFeedItemCursor(podcastUrl, episodeUrl);
if (itemCursor.moveToFirst()) {
List<FeedItem> list = extractItemlistFromCursor(adapter, itemCursor);
if (list.size() > 0) {
if (!list.isEmpty()) {
item = list.get(0);
loadAdditionalFeedItemListData(list);
if (item.hasChapters()) {
loadChaptersOfFeedItem(adapter, item);
}
}
}
itemCursor.close();
return item;
} finally {
if (cursor != null) {
cursor.close();
}
}
/**
* Loads specific FeedItems from the database. This method canbe used for loading more
* than one FeedItem
*
* @param itemIds The IDs of the FeedItems
* @return The FeedItems or an empty list if none of the FeedItems could be found. All FeedComponent-attributes
* as well as chapter marks of the FeedItems will also be loaded from the database.
*/
public static List<FeedItem> getFeedItems(final long... itemIds) {
Log.d(TAG, "getFeedItems() called with: " + "itemIds = [" + Arrays.toString(itemIds) + "]");
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
List<FeedItem> items = getFeedItems(adapter, itemIds);
adapter.close();
return items;
}
/**
* Returns credentials based on image URL
@ -699,16 +726,18 @@ public final class DBReader {
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
String credentials = getImageAuthentication(imageUrl, adapter);
try {
return getImageAuthentication(imageUrl, adapter);
} finally {
adapter.close();
return credentials;
}
}
static String getImageAuthentication(final String imageUrl, PodDBAdapter adapter) {
private static String getImageAuthentication(final String imageUrl, PodDBAdapter adapter) {
String credentials = null;
Cursor cursor = adapter.getImageAuthenticationCursor(imageUrl);
Cursor cursor = null;
try {
cursor = adapter.getImageAuthenticationCursor(imageUrl);
if (cursor.moveToFirst()) {
String username = cursor.getString(0);
String password = cursor.getString(1);
@ -721,8 +750,10 @@ public final class DBReader {
credentials = "";
}
} finally {
if (cursor != null) {
cursor.close();
}
}
return credentials;
}
@ -739,9 +770,11 @@ public final class DBReader {
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
FeedItem item = getFeedItem(podcastUrl, episodeUrl, adapter);
try {
return getFeedItem(podcastUrl, episodeUrl, adapter);
} finally {
adapter.close();
return item;
}
}
/**
@ -753,18 +786,24 @@ public final class DBReader {
Log.d(TAG, "loadExtraInformationOfFeedItem() called with: " + "item = [" + item + "]");
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
Cursor extraCursor = adapter.getExtraInformationOfItem(item);
if (extraCursor.moveToFirst()) {
int indexDescription = extraCursor.getColumnIndex(PodDBAdapter.KEY_DESCRIPTION);
String description = extraCursor.getString(indexDescription);
int indexContentEncoded = extraCursor.getColumnIndex(PodDBAdapter.KEY_CONTENT_ENCODED);
String contentEncoded = extraCursor.getString(indexContentEncoded);
Cursor cursor = null;
try {
cursor = adapter.getExtraInformationOfItem(item);
if (cursor.moveToFirst()) {
int indexDescription = cursor.getColumnIndex(PodDBAdapter.KEY_DESCRIPTION);
String description = cursor.getString(indexDescription);
int indexContentEncoded = cursor.getColumnIndex(PodDBAdapter.KEY_CONTENT_ENCODED);
String contentEncoded = cursor.getString(indexContentEncoded);
item.setDescription(description);
item.setContentEncoded(contentEncoded);
}
extraCursor.close();
} finally {
if (cursor != null) {
cursor.close();
}
adapter.close();
}
}
/**
* Loads the list of chapters that belongs to this FeedItem if available. This method overwrites
@ -775,52 +814,60 @@ public final class DBReader {
*/
public static void loadChaptersOfFeedItem(final FeedItem item) {
Log.d(TAG, "loadChaptersOfFeedItem() called with: " + "item = [" + item + "]");
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
try {
loadChaptersOfFeedItem(adapter, item);
} finally {
adapter.close();
}
}
static void loadChaptersOfFeedItem(PodDBAdapter adapter, FeedItem item) {
Cursor chapterCursor = adapter.getSimpleChaptersOfFeedItemCursor(item);
if (chapterCursor.moveToFirst()) {
item.setChapters(new ArrayList<>());
do {
int indexType = chapterCursor.getColumnIndex(PodDBAdapter.KEY_CHAPTER_TYPE);
int indexStart = chapterCursor.getColumnIndex(PodDBAdapter.KEY_START);
int indexTitle = chapterCursor.getColumnIndex(PodDBAdapter.KEY_TITLE);
int indexLink = chapterCursor.getColumnIndex(PodDBAdapter.KEY_LINK);
Cursor cursor = null;
try {
cursor = adapter.getSimpleChaptersOfFeedItemCursor(item);
int chaptersCount = cursor.getCount();
if (chaptersCount == 0) {
item.setChapters(null);
return;
}
item.setChapters(new ArrayList<>(chaptersCount));
while (cursor.moveToNext()) {
int indexType = cursor.getColumnIndex(PodDBAdapter.KEY_CHAPTER_TYPE);
int indexStart = cursor.getColumnIndex(PodDBAdapter.KEY_START);
int indexTitle = cursor.getColumnIndex(PodDBAdapter.KEY_TITLE);
int indexLink = cursor.getColumnIndex(PodDBAdapter.KEY_LINK);
int chapterType = chapterCursor.getInt(indexType);
int chapterType = cursor.getInt(indexType);
Chapter chapter = null;
long start = chapterCursor.getLong(indexStart);
String title = chapterCursor.getString(indexTitle);
String link = chapterCursor.getString(indexLink);
long start = cursor.getLong(indexStart);
String title = cursor.getString(indexTitle);
String link = cursor.getString(indexLink);
switch (chapterType) {
case SimpleChapter.CHAPTERTYPE_SIMPLECHAPTER:
chapter = new SimpleChapter(start, title, item,
link);
chapter = new SimpleChapter(start, title, item, link);
break;
case ID3Chapter.CHAPTERTYPE_ID3CHAPTER:
chapter = new ID3Chapter(start, title, item,
link);
chapter = new ID3Chapter(start, title, item, link);
break;
case VorbisCommentChapter.CHAPTERTYPE_VORBISCOMMENT_CHAPTER:
chapter = new VorbisCommentChapter(start,
title, item, link);
chapter = new VorbisCommentChapter(start, title, item, link);
break;
}
if (chapter != null) {
int indexId = chapterCursor.getColumnIndex(PodDBAdapter.KEY_ID);
chapter.setId(chapterCursor.getLong(indexId));
int indexId = cursor.getColumnIndex(PodDBAdapter.KEY_ID);
chapter.setId(cursor.getLong(indexId));
item.getChapters().add(chapter);
}
} while (chapterCursor.moveToNext());
} else {
item.setChapters(null);
}
chapterCursor.close();
} finally {
if (cursor != null) {
cursor.close();
}
}
}
/**
@ -828,13 +875,17 @@ public final class DBReader {
*
* @return The number of downloaded episodes.
*/
public static int getNumberOfDownloadedEpisodes() {
Log.d(TAG, "getNumberOfDownloadedEpisodes() called with: " + "");
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
final int result = adapter.getNumberOfDownloadedEpisodes();
try {
return adapter.getNumberOfDownloadedEpisodes();
} finally {
adapter.close();
return result;
}
}
/**
@ -847,9 +898,11 @@ public final class DBReader {
Log.d(TAG, "getFeedImage() called with: " + "imageId = [" + imageId + "]");
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
FeedImage result = getFeedImage(adapter, imageId);
try {
return getFeedImage(adapter, imageId);
} finally {
adapter.close();
return result;
}
}
/**
@ -874,15 +927,16 @@ public final class DBReader {
ids[i] = String.valueOf(imageIds[i]);
}
Cursor cursor = adapter.getImageCursor(ids);
Map<Long, FeedImage> result = new ArrayMap<>(cursor.getCount());
try {
if ((cursor.getCount() == 0) || !cursor.moveToFirst()) {
int imageCount = cursor.getCount();
if (imageCount == 0) {
return Collections.emptyMap();
}
do {
Map<Long, FeedImage> result = new ArrayMap<>(imageCount);
try {
while (cursor.moveToNext()) {
FeedImage image = FeedImage.fromCursor(cursor);
result.put(image.getId(), image);
} while(cursor.moveToNext());
}
} finally {
cursor.close();
}
@ -899,18 +953,16 @@ public final class DBReader {
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
Cursor mediaCursor = adapter.getSingleFeedMediaCursor(mediaId);
Cursor mediaCursor = null;
try {
mediaCursor = adapter.getSingleFeedMediaCursor(mediaId);
if (!mediaCursor.moveToFirst()) {
mediaCursor.close();
return null;
}
int indexFeedItem = mediaCursor.getColumnIndex(PodDBAdapter.KEY_FEEDITEM);
long itemId = mediaCursor.getLong(indexFeedItem);
FeedMedia media = FeedMedia.fromCursor(mediaCursor);
mediaCursor.close();
if (media != null) {
FeedItem item = getFeedItem(itemId);
if (item != null) {
@ -918,10 +970,14 @@ public final class DBReader {
item.setMedia(media);
}
}
adapter.close();
return media;
} finally {
if (mediaCursor != null) {
mediaCursor.close();
}
adapter.close();
}
}
/**
@ -1100,7 +1156,6 @@ public final class DBReader {
* Returns data necessary for displaying the navigation drawer. This includes
* the list of subscriptions, the number of items in the queue and the number of unread
* items.
*
*/
public static NavDrawerData getNavDrawerData() {
Log.d(TAG, "getNavDrawerData() called with: " + "");

View File

@ -1156,7 +1156,9 @@ public class PodDBAdapter {
+ TABLE_NAME_FEED_IMAGES + " WHERE " + KEY_ID + " IN "
+ buildInOperator(neededLength), parts);
}
return new MergeCursor(cursors);
Cursor result = new MergeCursor(cursors);
result.moveToFirst();
return result;
} else {
return db.query(TABLE_NAME_FEED_IMAGES, null, KEY_ID + " IN "
+ buildInOperator(length), imageIds, null, null, null);
@ -1341,7 +1343,9 @@ public class PodDBAdapter {
+ TABLE_NAME_FEED_MEDIA + " WHERE " + KEY_FEEDITEM + " IN "
+ buildInOperator(neededLength), parts);
}
return new MergeCursor(cursors);
Cursor result = new MergeCursor(cursors);
result.moveToFirst();
return result;
} else {
return db.query(TABLE_NAME_FEED_MEDIA, null, KEY_FEEDITEM + " IN "
+ buildInOperator(length), itemIds, null, null, null);