mirror of
https://github.com/etesync/android
synced 2025-01-11 08:10:58 +00:00
Sync database optimizations
* enable WAL as early as possible * don't close database in SyncAdapter but only in SyncService * version bump to 1.0.4
This commit is contained in:
parent
c6aed90c96
commit
fa528a64e9
@ -17,8 +17,8 @@ android {
|
|||||||
minSdkVersion 14
|
minSdkVersion 14
|
||||||
targetSdkVersion 22
|
targetSdkVersion 22
|
||||||
|
|
||||||
versionCode 93
|
versionCode 94
|
||||||
versionName "1.0.3"
|
versionName "1.0.4"
|
||||||
|
|
||||||
buildConfigField "long", "buildTime", System.currentTimeMillis() + "L"
|
buildConfigField "long", "buildTime", System.currentTimeMillis() + "L"
|
||||||
}
|
}
|
||||||
|
@ -72,15 +72,21 @@ public class ServiceDB {
|
|||||||
|
|
||||||
public OpenHelper(Context context) {
|
public OpenHelper(Context context) {
|
||||||
super(context, DATABASE_NAME, null, DATABASE_VERSION);
|
super(context, DATABASE_NAME, null, DATABASE_VERSION);
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
|
||||||
|
setWriteAheadLoggingEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onOpen(SQLiteDatabase db) {
|
public void onOpen(SQLiteDatabase db) {
|
||||||
db.enableWriteAheadLogging();
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
|
||||||
db.setForeignKeyConstraintsEnabled(true);
|
db.setForeignKeyConstraintsEnabled(true);
|
||||||
else
|
else {
|
||||||
|
if (!db.enableWriteAheadLogging())
|
||||||
|
App.log.warning("Couldn't enable write-ahead logging");
|
||||||
|
|
||||||
db.execSQL("PRAGMA foreign_keys=ON;");
|
db.execSQL("PRAGMA foreign_keys=ON;");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -8,18 +8,14 @@
|
|||||||
package at.bitfire.davdroid.syncadapter;
|
package at.bitfire.davdroid.syncadapter;
|
||||||
|
|
||||||
import android.accounts.Account;
|
import android.accounts.Account;
|
||||||
import android.app.Service;
|
|
||||||
import android.content.AbstractThreadedSyncAdapter;
|
|
||||||
import android.content.ContentProviderClient;
|
import android.content.ContentProviderClient;
|
||||||
import android.content.ContentValues;
|
import android.content.ContentValues;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.SyncResult;
|
import android.content.SyncResult;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.database.DatabaseUtils;
|
import android.database.DatabaseUtils;
|
||||||
import android.database.sqlite.SQLiteDatabase;
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.IBinder;
|
|
||||||
import android.provider.CalendarContract;
|
import android.provider.CalendarContract;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
@ -32,7 +28,6 @@ import at.bitfire.davdroid.App;
|
|||||||
import at.bitfire.davdroid.InvalidAccountException;
|
import at.bitfire.davdroid.InvalidAccountException;
|
||||||
import at.bitfire.davdroid.model.CollectionInfo;
|
import at.bitfire.davdroid.model.CollectionInfo;
|
||||||
import at.bitfire.davdroid.model.ServiceDB.Collections;
|
import at.bitfire.davdroid.model.ServiceDB.Collections;
|
||||||
import at.bitfire.davdroid.model.ServiceDB.OpenHelper;
|
|
||||||
import at.bitfire.davdroid.model.ServiceDB.Services;
|
import at.bitfire.davdroid.model.ServiceDB.Services;
|
||||||
import at.bitfire.davdroid.resource.LocalCalendar;
|
import at.bitfire.davdroid.resource.LocalCalendar;
|
||||||
import at.bitfire.ical4android.CalendarStorageException;
|
import at.bitfire.ical4android.CalendarStorageException;
|
||||||
@ -43,14 +38,14 @@ public class CalendarsSyncAdapterService extends SyncAdapterService {
|
|||||||
@Override
|
@Override
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
super.onCreate();
|
super.onCreate();
|
||||||
syncAdapter = new SyncAdapter(this, dbHelper);
|
syncAdapter = new SyncAdapter(this, dbHelper.getReadableDatabase());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static class SyncAdapter extends SyncAdapterService.SyncAdapter {
|
private static class SyncAdapter extends SyncAdapterService.SyncAdapter {
|
||||||
|
|
||||||
public SyncAdapter(Context context, OpenHelper dbHelper) {
|
public SyncAdapter(Context context, SQLiteDatabase db) {
|
||||||
super(context, dbHelper);
|
super(context, db);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -8,31 +8,24 @@
|
|||||||
package at.bitfire.davdroid.syncadapter;
|
package at.bitfire.davdroid.syncadapter;
|
||||||
|
|
||||||
import android.accounts.Account;
|
import android.accounts.Account;
|
||||||
import android.app.Service;
|
|
||||||
import android.content.AbstractThreadedSyncAdapter;
|
|
||||||
import android.content.ContentProviderClient;
|
import android.content.ContentProviderClient;
|
||||||
import android.content.ContentValues;
|
import android.content.ContentValues;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.SyncResult;
|
import android.content.SyncResult;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.database.DatabaseUtils;
|
import android.database.DatabaseUtils;
|
||||||
import android.database.sqlite.SQLiteDatabase;
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.IBinder;
|
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
import at.bitfire.davdroid.AccountSettings;
|
|
||||||
import at.bitfire.davdroid.App;
|
import at.bitfire.davdroid.App;
|
||||||
import at.bitfire.davdroid.InvalidAccountException;
|
import at.bitfire.davdroid.InvalidAccountException;
|
||||||
import at.bitfire.davdroid.model.CollectionInfo;
|
import at.bitfire.davdroid.model.CollectionInfo;
|
||||||
import at.bitfire.davdroid.model.ServiceDB;
|
import at.bitfire.davdroid.model.ServiceDB;
|
||||||
import at.bitfire.davdroid.model.ServiceDB.Collections;
|
import at.bitfire.davdroid.model.ServiceDB.Collections;
|
||||||
import at.bitfire.davdroid.model.ServiceDB.OpenHelper;
|
|
||||||
import lombok.Cleanup;
|
import lombok.Cleanup;
|
||||||
|
|
||||||
public class ContactsSyncAdapterService extends SyncAdapterService {
|
public class ContactsSyncAdapterService extends SyncAdapterService {
|
||||||
@ -40,14 +33,14 @@ public class ContactsSyncAdapterService extends SyncAdapterService {
|
|||||||
@Override
|
@Override
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
super.onCreate();
|
super.onCreate();
|
||||||
syncAdapter = new ContactsSyncAdapter(this, dbHelper);
|
syncAdapter = new ContactsSyncAdapter(this, dbHelper.getReadableDatabase());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static class ContactsSyncAdapter extends SyncAdapter {
|
private static class ContactsSyncAdapter extends SyncAdapter {
|
||||||
|
|
||||||
public ContactsSyncAdapter(Context context, OpenHelper dbHelper) {
|
public ContactsSyncAdapter(Context context, SQLiteDatabase db) {
|
||||||
super(context, dbHelper);
|
super(context, db);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -50,11 +50,12 @@ public abstract class SyncAdapterService extends Service {
|
|||||||
|
|
||||||
|
|
||||||
public static abstract class SyncAdapter extends AbstractThreadedSyncAdapter {
|
public static abstract class SyncAdapter extends AbstractThreadedSyncAdapter {
|
||||||
protected final SQLiteDatabase db;
|
|
||||||
|
|
||||||
public SyncAdapter(Context context, ServiceDB.OpenHelper dbHelper) {
|
protected final SQLiteDatabase db; // will be closed in SyncAdapterService::onDestroy(), don't close manually!
|
||||||
|
|
||||||
|
public SyncAdapter(Context context, SQLiteDatabase db) {
|
||||||
super(context, false);
|
super(context, false);
|
||||||
db = dbHelper.getReadableDatabase();
|
this.db = db;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -8,18 +8,14 @@
|
|||||||
package at.bitfire.davdroid.syncadapter;
|
package at.bitfire.davdroid.syncadapter;
|
||||||
|
|
||||||
import android.accounts.Account;
|
import android.accounts.Account;
|
||||||
import android.app.Service;
|
|
||||||
import android.content.AbstractThreadedSyncAdapter;
|
|
||||||
import android.content.ContentProviderClient;
|
import android.content.ContentProviderClient;
|
||||||
import android.content.ContentValues;
|
import android.content.ContentValues;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.SyncResult;
|
import android.content.SyncResult;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.database.DatabaseUtils;
|
import android.database.DatabaseUtils;
|
||||||
import android.database.sqlite.SQLiteDatabase;
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.IBinder;
|
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
|
|
||||||
@ -31,7 +27,6 @@ import at.bitfire.davdroid.App;
|
|||||||
import at.bitfire.davdroid.InvalidAccountException;
|
import at.bitfire.davdroid.InvalidAccountException;
|
||||||
import at.bitfire.davdroid.model.CollectionInfo;
|
import at.bitfire.davdroid.model.CollectionInfo;
|
||||||
import at.bitfire.davdroid.model.ServiceDB.Collections;
|
import at.bitfire.davdroid.model.ServiceDB.Collections;
|
||||||
import at.bitfire.davdroid.model.ServiceDB.OpenHelper;
|
|
||||||
import at.bitfire.davdroid.model.ServiceDB.Services;
|
import at.bitfire.davdroid.model.ServiceDB.Services;
|
||||||
import at.bitfire.davdroid.resource.LocalTaskList;
|
import at.bitfire.davdroid.resource.LocalTaskList;
|
||||||
import at.bitfire.ical4android.CalendarStorageException;
|
import at.bitfire.ical4android.CalendarStorageException;
|
||||||
@ -43,14 +38,14 @@ public class TasksSyncAdapterService extends SyncAdapterService {
|
|||||||
@Override
|
@Override
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
super.onCreate();
|
super.onCreate();
|
||||||
syncAdapter = new SyncAdapter(this, dbHelper);
|
syncAdapter = new SyncAdapter(this, dbHelper.getReadableDatabase());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static class SyncAdapter extends SyncAdapterService.SyncAdapter {
|
private static class SyncAdapter extends SyncAdapterService.SyncAdapter {
|
||||||
|
|
||||||
public SyncAdapter(Context context, OpenHelper dbHelper) {
|
public SyncAdapter(Context context, SQLiteDatabase db) {
|
||||||
super(context, dbHelper);
|
super(context, db);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -73,8 +68,6 @@ public class TasksSyncAdapterService extends SyncAdapterService {
|
|||||||
App.log.log(Level.SEVERE, "Couldn't enumerate local task lists", e);
|
App.log.log(Level.SEVERE, "Couldn't enumerate local task lists", e);
|
||||||
} catch (InvalidAccountException e) {
|
} catch (InvalidAccountException e) {
|
||||||
App.log.log(Level.SEVERE, "Couldn't get account settings", e);
|
App.log.log(Level.SEVERE, "Couldn't get account settings", e);
|
||||||
} finally {
|
|
||||||
db.close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
App.log.info("Task sync complete");
|
App.log.info("Task sync complete");
|
||||||
|
Loading…
Reference in New Issue
Block a user