Enable WAL and use non-exclusive transactions
This commit is contained in:
parent
05ef0a91a5
commit
a7368eadd9
|
@ -10,6 +10,7 @@ import android.database.sqlite.SQLiteDatabase;
|
|||
import android.database.sqlite.SQLiteDatabase.CursorFactory;
|
||||
import android.database.sqlite.SQLiteOpenHelper;
|
||||
import android.media.MediaMetadataRetriever;
|
||||
import android.os.Build;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
|
||||
|
@ -323,6 +324,9 @@ public class PodDBAdapter {
|
|||
Log.v(TAG, "Opening DB");
|
||||
try {
|
||||
db = dbHelper.getWritableDatabase();
|
||||
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
|
||||
db.enableWriteAheadLogging();
|
||||
}
|
||||
} catch (SQLException ex) {
|
||||
Log.e(TAG, Log.getStackTraceString(ex));
|
||||
db = dbHelper.getReadableDatabase();
|
||||
|
@ -425,34 +429,46 @@ public class PodDBAdapter {
|
|||
*/
|
||||
public long setImage(FeedImage image) {
|
||||
boolean startedTransaction = false;
|
||||
if(!db.inTransaction()) {
|
||||
db.beginTransaction();
|
||||
startedTransaction = true;
|
||||
}
|
||||
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(KEY_TITLE, image.getTitle());
|
||||
values.put(KEY_DOWNLOAD_URL, image.getDownload_url());
|
||||
values.put(KEY_DOWNLOADED, image.isDownloaded());
|
||||
values.put(KEY_FILE_URL, image.getFile_url());
|
||||
if (image.getId() == 0) {
|
||||
image.setId(db.insert(TABLE_NAME_FEED_IMAGES, null, values));
|
||||
} else {
|
||||
db.update(TABLE_NAME_FEED_IMAGES, values, KEY_ID + "=?",
|
||||
new String[]{String.valueOf(image.getId())});
|
||||
}
|
||||
|
||||
final FeedComponent owner = image.getOwner();
|
||||
if (owner != null && owner.getId() != 0) {
|
||||
values.clear();
|
||||
values.put(KEY_IMAGE, image.getId());
|
||||
if (owner instanceof Feed) {
|
||||
db.update(TABLE_NAME_FEEDS, values, KEY_ID + "=?", new String[]{String.valueOf(image.getOwner().getId())});
|
||||
try {
|
||||
if (!db.inTransaction()) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
|
||||
db.beginTransactionNonExclusive();
|
||||
} else {
|
||||
db.beginTransaction();
|
||||
}
|
||||
startedTransaction = true;
|
||||
}
|
||||
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(KEY_TITLE, image.getTitle());
|
||||
values.put(KEY_DOWNLOAD_URL, image.getDownload_url());
|
||||
values.put(KEY_DOWNLOADED, image.isDownloaded());
|
||||
values.put(KEY_FILE_URL, image.getFile_url());
|
||||
if (image.getId() == 0) {
|
||||
image.setId(db.insert(TABLE_NAME_FEED_IMAGES, null, values));
|
||||
} else {
|
||||
db.update(TABLE_NAME_FEED_IMAGES, values, KEY_ID + "=?",
|
||||
new String[]{String.valueOf(image.getId())});
|
||||
}
|
||||
|
||||
final FeedComponent owner = image.getOwner();
|
||||
if (owner != null && owner.getId() != 0) {
|
||||
values.clear();
|
||||
values.put(KEY_IMAGE, image.getId());
|
||||
if (owner instanceof Feed) {
|
||||
db.update(TABLE_NAME_FEEDS, values, KEY_ID + "=?", new String[]{String.valueOf(image.getOwner().getId())});
|
||||
}
|
||||
}
|
||||
if (startedTransaction) {
|
||||
db.setTransactionSuccessful();
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
Log.e(TAG, Log.getStackTraceString(e));
|
||||
} finally {
|
||||
if (startedTransaction) {
|
||||
db.endTransaction();
|
||||
}
|
||||
}
|
||||
if(startedTransaction) {
|
||||
db.setTransactionSuccessful();
|
||||
db.endTransaction();
|
||||
}
|
||||
return image.getId();
|
||||
}
|
||||
|
@ -522,20 +538,29 @@ public class PodDBAdapter {
|
|||
* transaction
|
||||
*/
|
||||
public void setCompleteFeed(Feed... feeds) {
|
||||
db.beginTransaction();
|
||||
for (Feed feed : feeds) {
|
||||
setFeed(feed);
|
||||
if (feed.getItems() != null) {
|
||||
for (FeedItem item : feed.getItems()) {
|
||||
setFeedItem(item, false);
|
||||
try {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
|
||||
db.beginTransactionNonExclusive();
|
||||
} else {
|
||||
db.beginTransaction();
|
||||
}
|
||||
for (Feed feed : feeds) {
|
||||
setFeed(feed);
|
||||
if (feed.getItems() != null) {
|
||||
for (FeedItem item : feed.getItems()) {
|
||||
setFeedItem(item, false);
|
||||
}
|
||||
}
|
||||
if (feed.getPreferences() != null) {
|
||||
setFeedPreferences(feed.getPreferences());
|
||||
}
|
||||
}
|
||||
if (feed.getPreferences() != null) {
|
||||
setFeedPreferences(feed.getPreferences());
|
||||
}
|
||||
db.setTransactionSuccessful();
|
||||
} catch (SQLException e) {
|
||||
Log.e(TAG, Log.getStackTraceString(e));
|
||||
} finally {
|
||||
db.endTransaction();
|
||||
}
|
||||
db.setTransactionSuccessful();
|
||||
db.endTransaction();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -598,19 +623,38 @@ public class PodDBAdapter {
|
|||
}
|
||||
|
||||
public void setFeedItemlist(List<FeedItem> items) {
|
||||
db.beginTransaction();
|
||||
for (FeedItem item : items) {
|
||||
setFeedItem(item, true);
|
||||
try {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
|
||||
db.beginTransactionNonExclusive();
|
||||
} else {
|
||||
db.beginTransaction();
|
||||
}
|
||||
for (FeedItem item : items) {
|
||||
setFeedItem(item, true);
|
||||
}
|
||||
db.setTransactionSuccessful();
|
||||
} catch (SQLException e) {
|
||||
Log.e(TAG, Log.getStackTraceString(e));
|
||||
} finally {
|
||||
db.endTransaction();
|
||||
}
|
||||
db.setTransactionSuccessful();
|
||||
db.endTransaction();
|
||||
}
|
||||
|
||||
public long setSingleFeedItem(FeedItem item) {
|
||||
db.beginTransaction();
|
||||
long result = setFeedItem(item, true);
|
||||
db.setTransactionSuccessful();
|
||||
db.endTransaction();
|
||||
long result = 0;
|
||||
try {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
|
||||
db.beginTransactionNonExclusive();
|
||||
} else {
|
||||
db.beginTransaction();
|
||||
}
|
||||
result = setFeedItem(item, true);
|
||||
db.setTransactionSuccessful();
|
||||
} catch (SQLException e) {
|
||||
Log.e(TAG, Log.getStackTraceString(e));
|
||||
} finally {
|
||||
db.endTransaction();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -728,20 +772,29 @@ public class PodDBAdapter {
|
|||
|
||||
public void setFeedItemRead(int played, long itemId, long mediaId,
|
||||
boolean resetMediaPosition) {
|
||||
db.beginTransaction();
|
||||
ContentValues values = new ContentValues();
|
||||
try {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
|
||||
db.beginTransactionNonExclusive();
|
||||
} else {
|
||||
db.beginTransaction();
|
||||
}
|
||||
ContentValues values = new ContentValues();
|
||||
|
||||
values.put(KEY_READ, played);
|
||||
db.update(TABLE_NAME_FEED_ITEMS, values, KEY_ID + "=?", new String[]{String.valueOf(itemId)});
|
||||
values.put(KEY_READ, played);
|
||||
db.update(TABLE_NAME_FEED_ITEMS, values, KEY_ID + "=?", new String[]{String.valueOf(itemId)});
|
||||
|
||||
if (resetMediaPosition) {
|
||||
values.clear();
|
||||
values.put(KEY_POSITION, 0);
|
||||
db.update(TABLE_NAME_FEED_MEDIA, values, KEY_ID + "=?", new String[]{String.valueOf(mediaId)});
|
||||
if (resetMediaPosition) {
|
||||
values.clear();
|
||||
values.put(KEY_POSITION, 0);
|
||||
db.update(TABLE_NAME_FEED_MEDIA, values, KEY_ID + "=?", new String[]{String.valueOf(mediaId)});
|
||||
}
|
||||
|
||||
db.setTransactionSuccessful();
|
||||
} catch (SQLException e) {
|
||||
Log.e(TAG, Log.getStackTraceString(e));
|
||||
} finally {
|
||||
db.endTransaction();
|
||||
}
|
||||
|
||||
db.setTransactionSuccessful();
|
||||
db.endTransaction();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -750,15 +803,24 @@ public class PodDBAdapter {
|
|||
* @param itemIds items to change the value of
|
||||
*/
|
||||
public void setFeedItemRead(int read, long... itemIds) {
|
||||
db.beginTransaction();
|
||||
ContentValues values = new ContentValues();
|
||||
for (long id : itemIds) {
|
||||
values.clear();
|
||||
values.put(KEY_READ, read);
|
||||
db.update(TABLE_NAME_FEED_ITEMS, values, KEY_ID + "=?", new String[]{String.valueOf(id)});
|
||||
try {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
|
||||
db.beginTransactionNonExclusive();
|
||||
} else {
|
||||
db.beginTransaction();
|
||||
}
|
||||
ContentValues values = new ContentValues();
|
||||
for (long id : itemIds) {
|
||||
values.clear();
|
||||
values.put(KEY_READ, read);
|
||||
db.update(TABLE_NAME_FEED_ITEMS, values, KEY_ID + "=?", new String[]{String.valueOf(id)});
|
||||
}
|
||||
db.setTransactionSuccessful();
|
||||
} catch (SQLException e) {
|
||||
Log.e(TAG, Log.getStackTraceString(e));
|
||||
} finally {
|
||||
db.endTransaction();
|
||||
}
|
||||
db.setTransactionSuccessful();
|
||||
db.endTransaction();
|
||||
}
|
||||
|
||||
public void setChapters(FeedItem item) {
|
||||
|
@ -822,17 +884,26 @@ public class PodDBAdapter {
|
|||
|
||||
public void setFavorites(List<FeedItem> favorites) {
|
||||
ContentValues values = new ContentValues();
|
||||
db.beginTransaction();
|
||||
db.delete(TABLE_NAME_FAVORITES, null, null);
|
||||
for (int i = 0; i < favorites.size(); i++) {
|
||||
FeedItem item = favorites.get(i);
|
||||
values.put(KEY_ID, i);
|
||||
values.put(KEY_FEEDITEM, item.getId());
|
||||
values.put(KEY_FEED, item.getFeed().getId());
|
||||
db.insertWithOnConflict(TABLE_NAME_FAVORITES, null, values, SQLiteDatabase.CONFLICT_REPLACE);
|
||||
try {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
|
||||
db.beginTransactionNonExclusive();
|
||||
} else {
|
||||
db.beginTransaction();
|
||||
}
|
||||
db.delete(TABLE_NAME_FAVORITES, null, null);
|
||||
for (int i = 0; i < favorites.size(); i++) {
|
||||
FeedItem item = favorites.get(i);
|
||||
values.put(KEY_ID, i);
|
||||
values.put(KEY_FEEDITEM, item.getId());
|
||||
values.put(KEY_FEED, item.getFeed().getId());
|
||||
db.insertWithOnConflict(TABLE_NAME_FAVORITES, null, values, SQLiteDatabase.CONFLICT_REPLACE);
|
||||
}
|
||||
db.setTransactionSuccessful();
|
||||
} catch (SQLException e) {
|
||||
Log.e(TAG, Log.getStackTraceString(e));
|
||||
} finally {
|
||||
db.endTransaction();
|
||||
}
|
||||
db.setTransactionSuccessful();
|
||||
db.endTransaction();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -880,17 +951,26 @@ public class PodDBAdapter {
|
|||
|
||||
public void setQueue(List<FeedItem> queue) {
|
||||
ContentValues values = new ContentValues();
|
||||
db.beginTransaction();
|
||||
db.delete(TABLE_NAME_QUEUE, null, null);
|
||||
for (int i = 0; i < queue.size(); i++) {
|
||||
FeedItem item = queue.get(i);
|
||||
values.put(KEY_ID, i);
|
||||
values.put(KEY_FEEDITEM, item.getId());
|
||||
values.put(KEY_FEED, item.getFeed().getId());
|
||||
db.insertWithOnConflict(TABLE_NAME_QUEUE, null, values, SQLiteDatabase.CONFLICT_REPLACE);
|
||||
try {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
|
||||
db.beginTransactionNonExclusive();
|
||||
} else {
|
||||
db.beginTransaction();
|
||||
}
|
||||
db.delete(TABLE_NAME_QUEUE, null, null);
|
||||
for (int i = 0; i < queue.size(); i++) {
|
||||
FeedItem item = queue.get(i);
|
||||
values.put(KEY_ID, i);
|
||||
values.put(KEY_FEEDITEM, item.getId());
|
||||
values.put(KEY_FEED, item.getFeed().getId());
|
||||
db.insertWithOnConflict(TABLE_NAME_QUEUE, null, values, SQLiteDatabase.CONFLICT_REPLACE);
|
||||
}
|
||||
db.setTransactionSuccessful();
|
||||
} catch (SQLException e) {
|
||||
Log.e(TAG, Log.getStackTraceString(e));
|
||||
} finally {
|
||||
db.endTransaction();
|
||||
}
|
||||
db.setTransactionSuccessful();
|
||||
db.endTransaction();
|
||||
}
|
||||
|
||||
public void clearQueue() {
|
||||
|
@ -937,23 +1017,32 @@ public class PodDBAdapter {
|
|||
* Remove a feed with all its FeedItems and Media entries.
|
||||
*/
|
||||
public void removeFeed(Feed feed) {
|
||||
db.beginTransaction();
|
||||
if (feed.getImage() != null) {
|
||||
removeFeedImage(feed.getImage());
|
||||
}
|
||||
if (feed.getItems() != null) {
|
||||
for (FeedItem item : feed.getItems()) {
|
||||
removeFeedItem(item);
|
||||
try {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
|
||||
db.beginTransactionNonExclusive();
|
||||
} else {
|
||||
db.beginTransaction();
|
||||
}
|
||||
}
|
||||
// delete download log entries for feed
|
||||
db.delete(TABLE_NAME_DOWNLOAD_LOG, KEY_FEEDFILE + "=? AND " + KEY_FEEDFILETYPE +"=?",
|
||||
new String[] { String.valueOf(feed.getId()), String.valueOf(Feed.FEEDFILETYPE_FEED) });
|
||||
if (feed.getImage() != null) {
|
||||
removeFeedImage(feed.getImage());
|
||||
}
|
||||
if (feed.getItems() != null) {
|
||||
for (FeedItem item : feed.getItems()) {
|
||||
removeFeedItem(item);
|
||||
}
|
||||
}
|
||||
// delete download log entries for feed
|
||||
db.delete(TABLE_NAME_DOWNLOAD_LOG, KEY_FEEDFILE + "=? AND " + KEY_FEEDFILETYPE + "=?",
|
||||
new String[]{String.valueOf(feed.getId()), String.valueOf(Feed.FEEDFILETYPE_FEED)});
|
||||
|
||||
db.delete(TABLE_NAME_FEEDS, KEY_ID + "=?",
|
||||
db.delete(TABLE_NAME_FEEDS, KEY_ID + "=?",
|
||||
new String[]{String.valueOf(feed.getId())});
|
||||
db.setTransactionSuccessful();
|
||||
db.endTransaction();
|
||||
db.setTransactionSuccessful();
|
||||
} catch (SQLException e) {
|
||||
Log.e(TAG, Log.getStackTraceString(e));
|
||||
} finally {
|
||||
db.endTransaction();
|
||||
}
|
||||
}
|
||||
|
||||
public void clearPlaybackHistory() {
|
||||
|
|
Loading…
Reference in New Issue