close database when cursor is closed for external provider

This commit is contained in:
Vincent Breitmoser 2017-08-29 19:38:25 +02:00
parent b450909300
commit 6e8a768011
2 changed files with 44 additions and 5 deletions

View file

@ -53,6 +53,7 @@ import org.sufficientlysecure.keychain.provider.KeychainExternalContract;
import org.sufficientlysecure.keychain.provider.KeychainExternalContract.AutocryptStatus;
import org.sufficientlysecure.keychain.provider.KeychainExternalContract.EmailStatus;
import org.sufficientlysecure.keychain.provider.SimpleContentResolverInterface;
import org.sufficientlysecure.keychain.util.CloseDatabaseCursorFactory;
import org.sufficientlysecure.keychain.util.Log;
public class KeychainExternalProvider extends ContentProvider implements SimpleContentResolverInterface {
@ -107,10 +108,6 @@ public class KeychainExternalProvider extends ContentProvider implements SimpleC
return true;
}
public KeychainDatabase getDb() {
return new KeychainDatabase(getContext());
}
/**
* {@inheritDoc}
*/
@ -146,7 +143,7 @@ public class KeychainExternalProvider extends ContentProvider implements SimpleC
String groupBy = null;
SQLiteDatabase db = getDb().getReadableDatabase();
SQLiteDatabase db = new KeychainDatabase(getContext()).getReadableDatabase();
String callingPackageName = mApiPermissionHelper.getCurrentCallingPackage();
@ -343,6 +340,7 @@ public class KeychainExternalProvider extends ContentProvider implements SimpleC
}
Cursor cursor = qb.query(db, projection, selection, null, groupBy, null, orderBy);
qb.setCursorFactory(new CloseDatabaseCursorFactory());
if (cursor != null) {
// Tell the cursor what uri to watch, so it knows when its source data changes
cursor.setNotificationUri(getContext().getContentResolver(), uri);

View file

@ -0,0 +1,41 @@
package org.sufficientlysecure.keychain.util;
import android.database.Cursor;
import android.database.sqlite.SQLiteCursor;
import android.database.sqlite.SQLiteCursorDriver;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteQuery;
import android.util.Log;
import org.sufficientlysecure.keychain.Constants;
public class CloseDatabaseCursorFactory implements CursorFactory {
private static class CloseDatabaseCursor extends SQLiteCursor {
CloseDatabaseCursor(SQLiteDatabase db, SQLiteCursorDriver driver, String editTable, SQLiteQuery query) {
super(db, driver, editTable, query);
}
@Override
public void close() {
final SQLiteDatabase db = getDatabase();
super.close();
if (db != null) {
Log.d(Constants.TAG, "Closing cursor: " + db.getPath());
try {
db.close();
} catch (Exception e) {
Log.e(Constants.TAG, "Error closing db", e);
}
}
}
}
@Override
public Cursor newCursor(SQLiteDatabase db, SQLiteCursorDriver masterQuery,
String editTable, SQLiteQuery query) {
return new CloseDatabaseCursor(db, masterQuery, editTable, query);
}
}