Ich erstelle eine Android-Anwendung, in der ich eine lokale SQLite-Datenbank habe, um die aus der Kontaktliste ausgewählten Benutzerdetails zu speichern. Ich möchte meine SQLite-Datenbank aktualisieren, wenn in meinen Telefonkontakten Aktualisierungen vorhanden sind. Ich habe Content Observer verwendet, aber da ich neu in der Android-Entwicklung bin, könnte mir jeder bei der Verwendung von ContentObserver und den Methoden helfen, die ich befolgen kann, um meine lokale Datenbank zu aktualisieren.Wie kann ich meine lokale SQLite-Datenbank aktualisieren, wenn ein Update in meinen Kontakten vorhanden ist?
Antwort
ContentObserver ist eine abstrakte Klasse ohne abstrakte Methoden. Seine beiden onChange() Methoden sind ohne Logik implementiert. Und da diese bei jeder Änderung aufgerufen werden, müssen Sie sie überschreiben.
Da Google eine der beiden überladenen onChange() -Methoden erst kürzlich auf API-Ebene 16 hinzugefügt hat, ruft diese Methode standardmäßig die andere, ältere Methode auf.
Hier ist, was eine normale Umsetzung aussehen würde:
mit dem obigen Codeclass MyObserver extends ContentObserver {
public MyObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
this.onChange(selfChange, null);
}
@Override
public void onChange(boolean selfChange, Uri uri) {
// do s.th.
// depending on the handler you might be on the UI
// thread, so be cautious!
}
}
Manche Dinge sind wichtig. Das erste, was Sie wissen müssen, ist, dass die zweite Methode erst ab API-Stufe 16 verfügbar ist. Deshalb habe ich die Annotation SuppressLint hinzugefügt. Der Code funktioniert auf älteren Geräten gut, aber in diesem Fall ruft Android offensichtlich immer das alte an. Daher sollte Ihr Code nicht darauf angewiesen sein, dass ein URI ordnungsgemäß funktioniert.
Beachten Sie auch den Handler-Parameter im Konstruktor. Dieser Handler wird verwendet, um die onChange() -Methode auszuliefern. Wenn Sie also den Handler im UI-Thread erstellt haben, wird die onChange() -Methode auch im UI-Thread aufgerufen. Vermeiden Sie in diesem Fall, den ContentProvider in dieser Methode abzufragen. Verwenden Sie stattdessen eine AsyncTask oder einen Loader.
Wenn Sie einen NULL-Wert an den Konstruktor übergeben, ruft Android die onChange() -Methode sofort auf - unabhängig vom aktuellen Thread. Ich denke, es ist am besten, beim Erstellen des ContentObserver-Objekts immer einen Handler zu verwenden.
Ihre Inhalte Beobachter Registrieren Sie sich für Änderungen zu hören
Um Ihre ContentObserver Unterklasse registrieren Sie müssen einfach die registerContentObserver des ContentResolver nennen() -Methode:
getContentResolver().registerContentObserver(SOME_URI,true,yourObserver);
Es drei Parameter übernimmt. Der erste ist der URI, auf den zu hören ist. Ich werde den URI im nächsten Abschnitt ausführlicher behandeln.
Der zweite Parameter gibt an, ob alle Änderungen an URIs, die mit dem angegebenen URI beginnen, einen Methodenaufruf auslösen sollen oder nur auf genau diesen einen URI wechseln. Dies kann zum Beispiel für den ContactsContract-URI mit seinen vielen Nachkommen nützlich sein. Es kann aber auch nachteilig sein, dass die tatsächliche Änderung, die den Methodenaufruf verursacht hat, für Sie noch unklarer ist.
Der dritte Parameter ist eine Instanz Ihrer ContentObserver-Implementierung.
Die URIs Sie
Wie in meiner Einführung in Content-Provider Inhalt URIs verzeichnisbasierte oder sein können ID-basierte beobachten können.
Diese beiden URI-Typen können für Ihren Inhaltsbeobachter verwendet werden. Wenn Sie einen Detailbildschirm haben, würden Sie einen ID-basierten URI für Ihren Beobachter verwenden. Wenn Sie eine Liste von Daten verwenden, ist ein verzeichnisbasierter URI besser geeignet.
Dies funktioniert jedoch nicht immer.ContactsContract beispielsweise löst immer dann eine Änderung aus, wenn ein Kontakt geändert wurde, auch wenn Sie einen spezifischeren URI hören. Es hängt von der korrekten Implementierung des Inhaltsanbieters ab. Ich habe einen Fehlerbericht für den ContactsContract-Anbieter eingereicht. Bitte stimmen Sie für dieses Problem, wenn Sie einverstanden sind.
Wenn Sie einen Inhaltsanbieter für Ihre App schreiben, müssen Sie den richtigen URI angeben. Nur wenn Sie dies tun, funktioniert der hier beschriebene Feedback-Mechanismus. Dies ist wichtig für Ihre Beobachter - oder wenn der Anbieter auch für die Beobachter Ihrer Kunden exportiert wird. Und es ist auch wichtig für Lader. In meinem Beitrag erfahren Sie, wie Sie Inhaltsanbieter schreiben, um mehr darüber zu erfahren.
Hinweis: Wenn Sie Loader verwenden, müssen Sie Änderungen nicht selbst anhören. In diesem Fall registriert Android einen ContentObserver und löst Ihre LoaderCallbacks onLoadFinished() -Methode für alle Änderungen aus.
Sie
Wenn Sie einen Inhalt Beobachter deregistrieren nicht vergessen, Ihre Inhalte Beobachter registriert haben, ist es in Ihrer Verantwortung, auch sie deregistrieren. Andernfalls würden Sie ein Speicherleck erstellen und Ihre Aktivität würde nie Müll gesammelt werden.
Um deregistrieren Sie die unregisterContentObserver() -Methode des ContentResolver nennen:
getContentResolver().
unregisterContentObserver(yourObserver);
- 1. Update-Tabelle, wenn vorhanden
- 2. Wie kann ich meine Anwendung programmatisch aktualisieren?
- 3. Datenbankfeld aktualisieren, wenn Daten vorhanden sind
- 4. wenn Schlüssel vorhanden ist: update, sonst: Assoc
- 5. Wie kann ich ein Mongodb remote aktualisieren, wenn ich keine öffentliche IP für meinen PC habe?
- 6. Wie erstelle ich ein Echo, wenn eine Kopfzeile vorhanden ist?
- 7. Wie kann ich meine App aktualisieren
- 8. Wie kann ich Telefonnummern von entsprechenden Namen in meinen Kontakten erhalten?
- 9. Update mit dem Fall, wenn vorhanden Klausel
- 10. In Oracle SQL oder Update einfügen, wenn bereits ein Wert vorhanden ist?
- 11. Wenn ich scrolle, SwipeRefreshLayout aktualisieren meine App
- 12. bx slider: wie kann ich die Diashow deaktivieren, wenn nur ein Bild vorhanden ist
- 13. Wie kann ich meine lokale Niederlassung in GIT löschen?
- 14. Wie kann ich meinen WCF-Dienst aktualisieren, wenn ich den WCF Test Client verwende?
- 15. Chefvorlage Wenn Attribut vorhanden ist
- 16. Wenn Datensatz vorhanden ist, aktualisieren Sie andernfalls Einfügen
- 17. Wie kann ich meinen NSTimer aktualisieren, wenn ich den Wert des Zeitintervalls ändere
- 18. Wie kann ich den Nummernbereichsoperator in der Google-Suche verwenden, wenn ein zusätzliches Zeichen vorhanden ist?
- 19. Wie kann ich überprüfen, ob Int in Array vorhanden ist?
- 20. Wie kann ich meine App im App Store aktualisieren, wenn das Verteilungsbereitstellungsprofil abgelaufen ist?
- 21. Kann ich meine lokale Schriftart in Chrome deaktivieren?
- 22. Mein Variablenwert geändert, wie kann ich meine Funktion entsprechend aktualisieren?
- 23. Wie kann ich diese asynchrone Methode in meinen Xamarin Forms aufrufen, wenn meine App startet?
- 24. In eine Informix-Tabelle einfügen oder aktualisieren, wenn vorhanden
- 25. Wenn vorhanden Update sonst einfügen mysql
- 26. DynamoDB API: Wie kann ich eine Update-Anfrage "JSON-Attribut hinzufügen, wenn nicht vorhanden" erstellen?
- 27. Codeigniter einfügen, wenn nicht vorhanden und update wenn nicht
- 28. aktualisieren lokale Dateiabhängigkeit mit npm
- 29. SQL Select: Update falls vorhanden, Einfügen wenn nicht - Mit Datumsteilvergleich?
- 30. Wenn ACCESS_FINE_LOCATION bereits vorhanden ist, kann ich ACCESS_COARSE_LOCATION weglassen?
Sie Dienst verwenden können, regelmäßig zu überprüfen, ob es Änderung in Kontakt ist und Sie Datenbank aktualisieren .. – Mohit