Андроид не предоставляет способ сделать это с помощью статического метода ContentResolver#update()
.
Объяснение
Когда ContentResolver#notifyChange(Uri,ContentObserver)
вызывается с ContentObserver
объекта в качестве наблюдателя, который инициировал изменение, что ContentObserver
будет onChange()
вызывается с selfChange
набором к истинному
Из документов:
void android.content.ContentResolver.notifyChange (Uri uri, наблюдатель ContentObserver)
Параметры:
URI Ури контента, который был изменен.
observer Наблюдатель , инициировавший изменение, может быть пустым. Наблюдатель, что , инициировал изменение, получит уведомление только в том случае, если он имеет , запрошенный для получения уведомлений об изменении самообмена, путем реализации ContentObserver.deliverSelfNotifications() для возврата true.
Так что, если вы звоните notifyChange()
из вашего ContentProvider
обновления/вставки/удаления методы, которые, в свою очередь вызывается из ContentResolver
обновления/вставки/удаления методов, вы не будете иметь ContentObserver
ссылку перейти на notifyChange()
и так не будет selfChange
установить в true.
Обход
Это будет работать, если ContentProvider находится в том же процессе, что и код клиента. Он требует настраиваемого ContentProvider и более сложного/подверженного ошибкам вызова методов update/insert/delete.
В нашем производном ContentProvider
мы можем создать собственные методы, которые принимают параметр ContentObserver
. Например, если мы хотим иметь update()
вызов метода notifyChange()
с ContentObserver
мы могли бы сделать что-то вроде:
public class MyContentProvider extends ContentProvider {
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// Just call our new method with 'null' as the ContentObserver
update(uri,values,selection,selectionArgs,null);
}
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs, ContentObserver changeOriginator){
// Do the update
...
// Notify the change with the ContentObserver that wants to ignore it
getContext().getContentResolver().notifyChange(uri,changeOriginator);
}
Чтобы использовать новый метод, вы должны будете получить ContentProvider
объект из ContentResolver
и вызовите нашего новый update()
метод:
ContentProvider cP = getContentResolver().acquireContentProviderClient(URI).getLocalContentProvider();
MyContentProvider mCP = (MyContentProvider)cP;
mCP.update(URI, values, "_id = " + id, null, contentProvider);
Мне также хотелось бы получить разъяснения относительно того, что бы и не вызвало самоизменение. Кажется, это воспринимается как само собой разумеющееся в документации, но мне сложно определить, что влияет на нее. – spaaarky21 2013-04-29 20:52:32