diff --git a/src/at/bitfire/davdroid/resource/LocalAddressBook.java b/src/at/bitfire/davdroid/resource/LocalAddressBook.java index 1c308956..da6e075f 100644 --- a/src/at/bitfire/davdroid/resource/LocalAddressBook.java +++ b/src/at/bitfire/davdroid/resource/LocalAddressBook.java @@ -144,7 +144,7 @@ public class LocalAddressBook extends LocalCollection { Contact c = (Contact)res; try { - @Cleanup("close") Cursor cursor = providerClient.query(ContentUris.withAppendedId(entriesURI(), c.getLocalID()), + @Cleanup Cursor cursor = providerClient.query(ContentUris.withAppendedId(entriesURI(), c.getLocalID()), new String[] { entryColumnUID(), RawContacts.STARRED }, null, null, null); if (cursor != null && cursor.moveToNext()) { c.setUid(cursor.getString(0)); @@ -169,7 +169,7 @@ public class LocalAddressBook extends LocalCollection { } private void populateStructuredName(Contact c) throws RemoteException { - @Cleanup("close") Cursor cursor = providerClient.query(dataURI(), new String[] { + @Cleanup Cursor cursor = providerClient.query(dataURI(), new String[] { /* 0 */ StructuredName.DISPLAY_NAME, StructuredName.PREFIX, StructuredName.GIVEN_NAME, /* 3 */ StructuredName.MIDDLE_NAME, StructuredName.FAMILY_NAME, StructuredName.SUFFIX, /* 6 */ StructuredName.PHONETIC_GIVEN_NAME, StructuredName.PHONETIC_MIDDLE_NAME, StructuredName.PHONETIC_FAMILY_NAME @@ -191,7 +191,7 @@ public class LocalAddressBook extends LocalCollection { } protected void populatePhoneNumbers(Contact c) throws RemoteException { - @Cleanup("close") Cursor cursor = providerClient.query(dataURI(), new String[] { Phone.TYPE, Phone.LABEL, Phone.NUMBER }, + @Cleanup Cursor cursor = providerClient.query(dataURI(), new String[] { Phone.TYPE, Phone.LABEL, Phone.NUMBER }, Phone.RAW_CONTACT_ID + "=? AND " + Data.MIMETYPE + "=?", new String[] { String.valueOf(c.getLocalID()), Phone.CONTENT_ITEM_TYPE }, null); while (cursor != null && cursor.moveToNext()) { @@ -268,7 +268,7 @@ public class LocalAddressBook extends LocalCollection { } protected void populateEmailAddresses(Contact c) throws RemoteException { - @Cleanup("close") Cursor cursor = providerClient.query(dataURI(), new String[] { Email.TYPE, Email.ADDRESS, Email.LABEL }, + @Cleanup Cursor cursor = providerClient.query(dataURI(), new String[] { Email.TYPE, Email.ADDRESS, Email.LABEL }, Email.RAW_CONTACT_ID + "=? AND " + Data.MIMETYPE + "=?", new String[] { String.valueOf(c.getLocalID()), Email.CONTENT_ITEM_TYPE }, null); while (cursor != null && cursor.moveToNext()) { @@ -306,7 +306,7 @@ public class LocalAddressBook extends LocalCollection { } protected void populateOrganization(Contact c) throws RemoteException { - @Cleanup("close") Cursor cursor = providerClient.query(dataURI(), new String[] { Organization.COMPANY, Organization.TITLE }, + @Cleanup Cursor cursor = providerClient.query(dataURI(), new String[] { Organization.COMPANY, Organization.TITLE }, Photo.RAW_CONTACT_ID + "=? AND " + Data.MIMETYPE + "=?", new String[] { String.valueOf(c.getLocalID()), Organization.CONTENT_ITEM_TYPE }, null); if (cursor != null && cursor.moveToNext()) { @@ -320,7 +320,7 @@ public class LocalAddressBook extends LocalCollection { } protected void populateIMPPs(Contact c) throws RemoteException { - @Cleanup("close") Cursor cursor = providerClient.query(dataURI(), new String[] { Im.DATA, Im.TYPE, Im.LABEL, Im.PROTOCOL, Im.CUSTOM_PROTOCOL }, + @Cleanup Cursor cursor = providerClient.query(dataURI(), new String[] { Im.DATA, Im.TYPE, Im.LABEL, Im.PROTOCOL, Im.CUSTOM_PROTOCOL }, Photo.RAW_CONTACT_ID + "=? AND " + Data.MIMETYPE + "=?", new String[] { String.valueOf(c.getLocalID()), Im.CONTENT_ITEM_TYPE }, null); while (cursor != null && cursor.moveToNext()) { @@ -378,7 +378,7 @@ public class LocalAddressBook extends LocalCollection { } protected void populateNickname(Contact c) throws RemoteException { - @Cleanup("close") Cursor cursor = providerClient.query(dataURI(), new String[] { Nickname.NAME }, + @Cleanup Cursor cursor = providerClient.query(dataURI(), new String[] { Nickname.NAME }, Nickname.RAW_CONTACT_ID + "=? AND " + Data.MIMETYPE + "=?", new String[] { String.valueOf(c.getLocalID()), Nickname.CONTENT_ITEM_TYPE }, null); if (cursor != null && cursor.moveToNext()) @@ -386,7 +386,7 @@ public class LocalAddressBook extends LocalCollection { } protected void populateNote(Contact c) throws RemoteException { - @Cleanup("close") Cursor cursor = providerClient.query(dataURI(), new String[] { Note.NOTE }, + @Cleanup Cursor cursor = providerClient.query(dataURI(), new String[] { Note.NOTE }, Website.RAW_CONTACT_ID + "=? AND " + Data.MIMETYPE + "=?", new String[] { String.valueOf(c.getLocalID()), Note.CONTENT_ITEM_TYPE }, null); if (cursor != null && cursor.moveToNext()) @@ -394,7 +394,7 @@ public class LocalAddressBook extends LocalCollection { } protected void populatePostalAddresses(Contact c) throws RemoteException { - @Cleanup("close") Cursor cursor = providerClient.query(dataURI(), new String[] { + @Cleanup Cursor cursor = providerClient.query(dataURI(), new String[] { /* 0 */ StructuredPostal.FORMATTED_ADDRESS, StructuredPostal.TYPE, StructuredPostal.LABEL, /* 3 */ StructuredPostal.STREET, StructuredPostal.POBOX, StructuredPostal.NEIGHBORHOOD, /* 6 */ StructuredPostal.CITY, StructuredPostal.REGION, StructuredPostal.POSTCODE, @@ -430,7 +430,7 @@ public class LocalAddressBook extends LocalCollection { } protected void populateURLs(Contact c) throws RemoteException { - @Cleanup("close") Cursor cursor = providerClient.query(dataURI(), new String[] { Website.URL }, + @Cleanup Cursor cursor = providerClient.query(dataURI(), new String[] { Website.URL }, Website.RAW_CONTACT_ID + "=? AND " + Data.MIMETYPE + "=?", new String[] { String.valueOf(c.getLocalID()), Website.CONTENT_ITEM_TYPE }, null); if (cursor != null && cursor.moveToNext()) @@ -438,7 +438,7 @@ public class LocalAddressBook extends LocalCollection { } protected void populateEvents(Contact c) throws RemoteException { - @Cleanup("close") Cursor cursor = providerClient.query(dataURI(), new String[] { CommonDataKinds.Event.TYPE, CommonDataKinds.Event.START_DATE }, + @Cleanup Cursor cursor = providerClient.query(dataURI(), new String[] { CommonDataKinds.Event.TYPE, CommonDataKinds.Event.START_DATE }, Photo.RAW_CONTACT_ID + "=? AND " + Data.MIMETYPE + "=?", new String[] { String.valueOf(c.getLocalID()), CommonDataKinds.Event.CONTENT_ITEM_TYPE }, null); while (cursor != null && cursor.moveToNext()) { diff --git a/src/at/bitfire/davdroid/resource/LocalCalendar.java b/src/at/bitfire/davdroid/resource/LocalCalendar.java index 0df72bb2..070afa8c 100644 --- a/src/at/bitfire/davdroid/resource/LocalCalendar.java +++ b/src/at/bitfire/davdroid/resource/LocalCalendar.java @@ -138,7 +138,7 @@ public class LocalCalendar extends LocalCollection { } public static LocalCalendar[] findAll(Account account, ContentProviderClient providerClient) throws RemoteException { - @Cleanup("close") Cursor cursor = providerClient.query(calendarsURI(account), + @Cleanup Cursor cursor = providerClient.query(calendarsURI(account), new String[] { Calendars._ID, Calendars.NAME, COLLECTION_COLUMN_CTAG }, Calendars.DELETED + "=0 AND " + Calendars.SYNC_EVENTS + "=1", null, null); @@ -199,7 +199,7 @@ public class LocalCalendar extends LocalCollection { Event e = (Event)resource; try { - @Cleanup("close") Cursor cursor = providerClient.query(ContentUris.withAppendedId(entriesURI(), e.getLocalID()), + @Cleanup Cursor cursor = providerClient.query(ContentUris.withAppendedId(entriesURI(), e.getLocalID()), new String[] { /* 0 */ Events.TITLE, Events.EVENT_LOCATION, Events.DESCRIPTION, /* 3 */ Events.DTSTART, Events.DTEND, Events.EVENT_TIMEZONE, Events.EVENT_END_TIMEZONE, Events.ALL_DAY, @@ -317,7 +317,7 @@ public class LocalCalendar extends LocalCollection { Uri attendeesUri = Attendees.CONTENT_URI.buildUpon() .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true") .build(); - @Cleanup("close") Cursor c = providerClient.query(attendeesUri, new String[] { + @Cleanup Cursor c = providerClient.query(attendeesUri, new String[] { /* 0 */ Attendees.ATTENDEE_EMAIL, Attendees.ATTENDEE_NAME, Attendees.ATTENDEE_TYPE, /* 3 */ Attendees.ATTENDEE_RELATIONSHIP, Attendees.STATUS }, Attendees.EVENT_ID + "=?", new String[] { String.valueOf(e.getLocalID()) }, null); @@ -377,7 +377,7 @@ public class LocalCalendar extends LocalCollection { Uri remindersUri = Reminders.CONTENT_URI.buildUpon() .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true") .build(); - @Cleanup("close") Cursor c = providerClient.query(remindersUri, new String[] { + @Cleanup Cursor c = providerClient.query(remindersUri, new String[] { /* 0 */ Reminders.MINUTES, Reminders.METHOD }, Reminders.EVENT_ID + "=?", new String[] { String.valueOf(e.getLocalID()) }, null); while (c != null && c.moveToNext()) { diff --git a/src/at/bitfire/davdroid/resource/LocalCollection.java b/src/at/bitfire/davdroid/resource/LocalCollection.java index 6da31365..4948e424 100644 --- a/src/at/bitfire/davdroid/resource/LocalCollection.java +++ b/src/at/bitfire/davdroid/resource/LocalCollection.java @@ -69,14 +69,18 @@ public abstract class LocalCollection { if (entryColumnParentID() != null) where += " AND " + entryColumnParentID() + "=" + String.valueOf(getId()); try { - @Cleanup("close") Cursor cursor = providerClient.query(entriesURI(), + @Cleanup Cursor cursor = providerClient.query(entriesURI(), new String[] { entryColumnID(), entryColumnRemoteName(), entryColumnETag() }, where, null, null); LinkedList dirty = new LinkedList(); while (cursor != null && cursor.moveToNext()) { - T resource = findById(cursor.getLong(0), true); - if (resource != null) + long id = cursor.getLong(0); + try { + T resource = findById(id, true); dirty.add(resource); + } catch (RecordNotFoundException e) { + Log.w(TAG, "Couldn't load dirty resource: " + ContentUris.appendId(entriesURI().buildUpon(), id), e); + } } return dirty.toArray(new Resource[0]); } catch(RemoteException ex) { @@ -89,14 +93,18 @@ public abstract class LocalCollection { if (entryColumnParentID() != null) where += " AND " + entryColumnParentID() + "=" + String.valueOf(getId()); try { - @Cleanup("close") Cursor cursor = providerClient.query(entriesURI(), + @Cleanup Cursor cursor = providerClient.query(entriesURI(), new String[] { entryColumnID(), entryColumnRemoteName(), entryColumnETag() }, where, null, null); LinkedList deleted = new LinkedList(); while (cursor != null && cursor.moveToNext()) { - T resource = findById(cursor.getLong(0), false); - if (resource != null) + long id = cursor.getLong(0); + try { + T resource = findById(id, false); deleted.add(resource); + } catch (RecordNotFoundException e) { + Log.w(TAG, "Couldn't load resource marked for deletion: " + ContentUris.appendId(entriesURI().buildUpon(), id), e); + } } return deleted.toArray(new Resource[0]); } catch(RemoteException ex) { @@ -109,13 +117,14 @@ public abstract class LocalCollection { if (entryColumnParentID() != null) where += " AND " + entryColumnParentID() + "=" + String.valueOf(getId()); try { - @Cleanup("close") Cursor cursor = providerClient.query(entriesURI(), + @Cleanup Cursor cursor = providerClient.query(entriesURI(), new String[] { entryColumnID() }, where, null, null); LinkedList fresh = new LinkedList(); while (cursor != null && cursor.moveToNext()) { - T resource = findById(cursor.getLong(0), true); - if (resource != null) { + long id = cursor.getLong(0); + try { + T resource = findById(id, true); resource.initialize(); // new record: set generated UID + remote file name in database @@ -126,6 +135,8 @@ public abstract class LocalCollection { .build()); fresh.add(resource); + } catch (RecordNotFoundException e) { + Log.w(TAG, "Couldn't load fresh resource: " + ContentUris.appendId(entriesURI().buildUpon(), id), e); } } return fresh.toArray(new Resource[0]); @@ -136,7 +147,7 @@ public abstract class LocalCollection { public T findById(long localID, boolean populate) throws LocalStorageException { try { - @Cleanup("close") Cursor cursor = providerClient.query(ContentUris.withAppendedId(entriesURI(), localID), + @Cleanup Cursor cursor = providerClient.query(ContentUris.withAppendedId(entriesURI(), localID), new String[] { entryColumnRemoteName(), entryColumnETag() }, null, null, null); if (cursor != null && cursor.moveToNext()) { T resource = newResource(localID, cursor.getString(0), cursor.getString(1)); @@ -152,7 +163,7 @@ public abstract class LocalCollection { public T findByRemoteName(String remoteName, boolean populate) throws LocalStorageException { try { - @Cleanup("close") Cursor cursor = providerClient.query(entriesURI(), + @Cleanup Cursor cursor = providerClient.query(entriesURI(), new String[] { entryColumnID(), entryColumnRemoteName(), entryColumnETag() }, entryColumnRemoteName() + "=?", new String[] { remoteName }, null); if (cursor != null && cursor.moveToNext()) {