Das Android-Framework bietet keine Möglichkeit, dies über die statische Methode ContentResolver#update()
zu tun.
Erklärung
Wenn ContentResolver#notifyChange(Uri,ContentObserver)
mit dem ContentObserver
Objekt als Beobachter genannt, der die Änderung initiiert, dass ContentObserver
onChange()
mit selfChange
Satz auf true
Von der Dokumentation genannt haben:
void android.content.ContentResolver.notifyChange (Uri uri, Beobachter von ContentObserver)
Parameter:
uri Die uri des Inhalts, geändert wurde.
Beobachter Der Beobachter, der die Änderung ausgelöst hat, kann null sein. Der Beobachter, der die Änderung initiierte, erhält nur dann die Benachrichtigung, wenn er angefordert hat, um Benachrichtigungen zur Eigenänderung zu empfangen, indem er ContentObserver.deliverSelfNotifications() implementiert, um "True" zurückzugeben.
Also, wenn Sie notifyChange()
aus Ihrer ContentProvider
Update/Insert-Aufruf/Löschen Methoden, die wiederum von den ContentResolver
Update/Insert aufgerufen werden/löschen Methoden, werden Sie nicht haben den ContentObserver
Bezug auf einen Pass zu spielen notifyChange()
und so wird nicht selfChange
auf wahr gesetzt haben.
Umgehung
Das funktioniert, wenn die Contentprovider im selben Prozess wie der Client-Code ist. Es erfordert einen benutzerdefinierten ContentProvider und einen komplexeren/fehleranfälligen Aufruf der update/insert/delete-Methoden.
Wir können benutzerdefinierte Methoden in unserem abgeleiteten ContentProvider
erstellen, die einen ContentObserver
als Parameter nehmen. unsere
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);
}
Zur Verwendung der neuen Methode, werden Sie haben, um das ContentProvider
Objekt aus dem ContentResolver
und rufen: Zum Beispiel, wenn wir die update()
Methodenaufruf notifyChange()
mit dem ContentObserver
wir tun, wäre so etwas wie haben wollte neu update()
methode:
ContentProvider cP = getContentResolver().acquireContentProviderClient(URI).getLocalContentProvider();
MyContentProvider mCP = (MyContentProvider)cP;
mCP.update(URI, values, "_id = " + id, null, contentProvider);
Ich möchte auch etwas Klärung darüber, was SelfChange würde und würde nicht wahr sein. Es scheint in der Dokumentation selbstverständlich zu sein, aber es fällt mir schwer herauszufinden, was das bewirkt. – spaaarky21