2016-04-07 13 views
-1

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?

+0

Sie Dienst verwenden können, regelmäßig zu überprüfen, ob es Änderung in Kontakt ist und Sie Datenbank aktualisieren .. – Mohit

Antwort

2

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 Code
class 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);