2009-09-09 19 views
51

मैं संपर्क डेटाबेस में किसी भी बदलाव की सुनवाई करने की कोशिश कर रहा हूं।संपर्क डेटाबेस में परिवर्तनों को कैसे सुनें

तो मैं अपने contentObserver जो ContentObserver का एक बच्चा वर्ग है बनाने के लिए:

private class MyContentObserver extends ContentObserver { 

     public MyContentObserver() { 
      super(null); 
     } 

     @Override 
     public void onChange(boolean selfChange) { 
      super.onChange(selfChange); 
      System.out.println (" Calling onChange"); 
     } 

    } 

MyContentObserver contentObserver = new MyContentObserver(); 
context.getContentResolver().registerContentObserver (People.CONTENT_URI, true, contentObserver); 

लेकिन जब मैं का उपयोग करें 'EditContactActivity' संपर्क डेटाबेस को बदलने के लिए, मेरे onChange() बुलाया प्राप्त करता है।

+3

FYI करें - यूआरआई People.CONTENT_URI बहिष्कृत हो गई है (आज से पहले - 2011/03/15)। संपर्कों का संदर्भ लें संपर्क करें। संपर्क। CONTENT_URI। – mobibob

+1

नमस्ते, किसी भी विचार से मैं परिवर्तन की प्रकृति पर जानकारी कैसे प्राप्त करूं? संपर्क जोड़ा, हटाया, अद्यतन, फ़ील्ड अद्यतन? –

उत्तर

53

मैंने आपके उदाहरण को तैनात किया है जैसा कि यह है, और यह ठीक काम करता है।

package com.test.contentobserver; 

import android.app.Activity; 
import android.database.ContentObserver; 
import android.os.Bundle; 
import android.provider.Contacts.People; 

public class TestContentObserver extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     this.getApplicationContext().getContentResolver().registerContentObserver (People.CONTENT_URI, true, contentObserver); 
    } 

    private class MyContentObserver extends ContentObserver { 

     public MyContentObserver() { 
      super(null); 
     } 

     @Override 
     public void onChange(boolean selfChange) { 
      super.onChange(selfChange); 
     } 

    } 

    MyContentObserver contentObserver = new MyContentObserver(); 

} 

तो, आपको कुछ और गलत करना होगा।

क्या आप कर्सर के माध्यम से परिवर्तन कर रहे हैं पर्यवेक्षक के साथ पंजीकृत है?

जांचें कि पर्यवेक्षक फ़ंक्शन डिलीवरी सेल्फ नोटिफिकेशन()। (यह डिफ़ॉल्ट रूप से झूठी रिटर्न)

आप की तरह कुछ के साथ कि पर्यवेक्षक समारोह ओवरराइड करना चाहते हो सकता है:

@Override 
public boolean deliverSelfNotifications() { 
    return true; 
    } 

सुनिश्चित करें कि People.CONTENT_URI मूल्य सही करने के लिए बात कर रहा है बनाएँ (android.provider.Contacts.People) ।

इसके अलावा, मैं आपको ContentObserver के साथ हैंडलर का उपयोग करने का सुझाव दूंगा, हालांकि यह इस मामले में आपके कोड को गलत नहीं बनाता है।

+1

अजीब है कि यह आपके लिए कोई हैंडलर के साथ काम करता है। यह मेरे लिए नहीं था। इसके अलावा, मुझे सच में आश्चर्य है कि आप यूआई थ्रेड पर अपना कोड कैसे निष्पादित कर सकते हैं ... हालांकि मुझे कुछ याद आ रहा है, मैं इस विषय में नया हूं। – Snicolas

+0

मुझे पता कैसे पता चलेगा कि एड्रेसबुक – user366584

+0

में संपर्क अपडेट किए गए हैं क्या कोई भी घटनाक्रम है जो संपर्क परिवर्तन से मेल खाता है ताकि उन्हें मेमोरी में अपनी ऐप की सेवा न पकड़ने के लिए मैनिफेस्ट फ़ाइल में शामिल किया जा सके? – kolyaseg

27

मैननीस के उत्तर के बारे में एक साधारण टीआईपी।

यहां, People.CONTENT_URI बहिष्कृत है।

कोड के रूप में इस प्रकार के बजाय .-->ContactsContract.Contacts.CONTENT_URI

getApplicationContext().getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true, contentobserver); 
+4

इस सामग्री ऑब्सर्वर में; क्या संपर्क जोड़ने का विवरण प्राप्त करने का कोई तरीका है जो जोड़ा या बदला ?? मैं एक समान श्रोता बनाना चाहता हूं लेकिन अतिरिक्त/संशोधित संपर्क पर कुछ ऑपरेशन करना चाहता हूं। – Allzhere

+0

जहां तक ​​मुझे पता है, 'कोटेन्ट ऑब्सर्वर' का उपयोग करना संभव नहीं है। इसका संदर्भ लें [लिंक] (http://stackoverflow.com/a/10432259/2124004) – Nizam

संबंधित मुद्दे