android는 ContentObserve를 사용하여 데이터베이스의 값 변화를 감청합니다

111015 단어 SQLite
실시간 통신을 할 때: 먼저 채팅 정보를 데이터베이스에 삽입한 후에야 보여준다. 데이터베이스에 대해 어떻게 감청을 하는가.
하나의 라인을 열어 어떤 데이터베이스를 대량으로 조회하다
값이 변경되어 비용이 많이 들기 때문에 Content Observe를 사용하여 데이터베이스를 감청할 수 있습니다.
필요한 지식:
1、
컨텐트 공급자
여기서 URI 해석을 위한 도구 클래스 UriMather가 제공되며,addURI()를 통해 새 uri를 등록할 수 있습니다.우리
이런 것들을 통해서 다른 걸 할 수 있어요.
Uri가 다른 결과를 조회해.Uri가 반환한 결과에 따라 Uri Type은 여러 데이터를 반환하는 Uri, 한 데이터를 반환하는 Uri로 나눌 수 있다.
context를 이용하다.getContentResolover () 는 ContentResolover 대상을 가져오고 호출합니다
registerContentObserver
() 방법은 내용 관찰자를 등록하는데 주의해야 할 것은 인터페이스가 소각될 때 반등록을 잊지 말아야 한다는 것이다. 예를 들어Activity의 onDe story 방법에서 호출 방법을 잊지 말아야 한다.
unregisterContentObserver
() 등록을 취소합니다.
2、ContentObserve
          
ContentObserver-내용 관찰자, 특정 Uri로 인한 데이터베이스 변화를 관찰(포착)하고 그에 상응하는 처리를 하는 목적이다.
(1) 구성 방법public void ContentObserver(Handler handler)
매개 변수:Handler 객체 - 주 스레드에서 UI를 수정할 수 있습니다.
(2) 일반적인 방법
 
  void onChange(boolean selfChange)
           
매개변수:
리셋 후, 그 값은 일반적으로false이며, 이 매개 변수는 의미가 크지 않다.
3、
public final void 
registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)
기능: 지정된 Uri에 대한 ContentObserver 파생 클래스 인스턴스를 등록하고 지정된 Uri가 변경되면 인스턴스 객체를 리콜하여 처리합니다.
매개 변수:uri가 관찰해야 하는 Uri(UriMatcher에 등록해야 한다. 그렇지 않으면 이 Uri도 의미가 없다. notifyForDescendents는false로 정확한 일치를 나타낸다. 즉, 이 Uri만 일치하고true로 파생된 Uri와 동시에 일치할 수 있음을 나타낸다. 예를 들어 다음과 같다.
UriMatcher에 등록된 Uri의 유형은 다음과 같습니다.
                                1 、content://com.qin.cb/student(학생)
                                2 、content://com.qin.cb/student/# 
                                3、 content://com.qin.cb/student/schoolchild(초등학생, 파생의 우리)
우리가 지금 관찰해야 할 Uri를content://com.qin.cb/student, 데이터가 변경된 경우 Uri는content://com.qin.cb/student/schoolchild, notifyForDescendents가false일 경우, 이Content Observer는 감청하지 못하지만, notifyForDescendents가ture일 경우,Uri의 데이터베이스 변화를 포착할 수 있습니다.
observer ContentObserver의 파생 클래스 인스턴스
   4、public final void  unregisterContentObserver(ContentObserver observer)
기능:주어진 Uri에 대한 관찰 취소
매개 변수:observer ContentObserver의 파생 클래스 인스턴스
public class MyDataProvider extends ContentProvider  
{  
  
    // public static final String SCHEME = "test";  
    public static final String SCHEME = "content"; //          ,            
  
    public static final String HOST = "com.zyj";  
    public static final String PORT = "497393102";  
    public static final String PATH = "simple";  
  
    public static final int ALARMS = 1;  
    public static final String SHARE_LIST_TYPE = "com.zyj.test.dir/";  
    public static final int ALARMS_ID = 2;  
    public static final String SHARE_TYPE = "com.zyj.test.item/";  
  
    private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);  
  
    private SQLiteOpenHelper mDB = null;  
  
    // ===content://com.zyj:497393102/simple  
    public static final Uri CONTENT_URI = Uri.parse(SCHEME + "://" + HOST + ":" + PORT + "/" + PATH);  
  
    //   Uri     ,               ,1          ,2             
    static  
    {  
        sURIMatcher.addURI(HOST + ":" + PORT, PATH, ALARMS);  
        sURIMatcher.addURI(HOST + ":" + PORT, PATH + "/#", ALARMS_ID);  
    }  
  
    @Override  
    public boolean onCreate()  
    {  
        mDB = new MyDB(getContext()); //           
        return mDB != null;  
    }  
  
    @Override  
    public String getType(Uri uri)  
    {  
        //         Uri   ,           
        int match = sURIMatcher.match(uri);  
        switch (match)  
        {  
            case ALARMS:  
            {  
                return SHARE_LIST_TYPE;  
            }  
            case ALARMS_ID:  
            {  
                return SHARE_TYPE;  
            }  
            default:  
            {  
                throw new IllegalArgumentException("Unknown URI: " + uri);  
            }  
        }  
    }  
  
    @Override  
    public Uri insert(Uri uri, ContentValues values)  
    {  
        //     Uri           ,,                      
        SQLiteDatabase db = mDB.getWritableDatabase();  
        if (sURIMatcher.match(uri) != ALARMS)  
        {  
            throw new IllegalArgumentException("Unknown/Invalid URI " + uri);  
        }  
  
        ContentValues filteredValues = new ContentValues();  
        filteredValues.put(MyDB.BEAN_ID, values.getAsInteger(MyDB.BEAN_ID));  
        filteredValues.put(MyDB.MESSAGE, values.getAsString(MyDB.MESSAGE));  
        filteredValues.put(MyDB.TASK_PROGRESS, values.getAsFloat(MyDB.TASK_PROGRESS));  
        long rowID = db.insert(MyDB.TABLET, null, filteredValues);  
        if (rowID != -1)  
        {  
            getContext().getContentResolver().notifyChange(uri, null);  
        }  
        return CONTENT_URI;  
    }  
  
    @Override  
    public int delete(Uri uri, String selection, String[] selectionArgs)  
    {  
  
        //     Uri           ,,         
  
        SQLiteDatabase db = mDB.getWritableDatabase();  
        int count = 0;  
        int match = sURIMatcher.match(uri);  
        switch (match)  
        {  
            case ALARMS:  
            case ALARMS_ID:  
                String where = null;  
                //    selection      ,                     
                if (selection != null)  
                {  
                    if (match == ALARMS)  
                    {  
                        where = "( " + selection + " )";  
                    }  
                    else  
                    {  
                        where = "( " + selection + " ) AND ";  
                    }  
                }  
                else  
                {  
                    where = "";  
                }  
                if (match == ALARMS_ID)  
                {  
                    //               ,   Uri     /item ,                     ,  sql    where  
                    String segment = uri.getPathSegments().get(1);  
                    long rowId = Long.parseLong(segment);  
                    where += " ( " + MyDB.BEAN_ID + " = " + rowId + " ) ";  
                }  
                count = db.delete(MyDB.TABLET, where, selectionArgs);  
                break;  
            default:  
                throw new UnsupportedOperationException("Cannot delete URI: " + uri);  
        }  
        getContext().getContentResolver().notifyChange(uri, null);  
        return count;  
    }  
  
    @Override  
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)  
    {  
        //        
        SQLiteDatabase db = mDB.getWritableDatabase();  
  
        int count;  
        long rowId = 0;  
  
        int match = sURIMatcher.match(uri);  
        switch (match)  
        {  
            case ALARMS:  
            case ALARMS_ID:  
            {  
                String myWhere;  
                if (selection != null)  
                {  
                    if (match == ALARMS)  
                    {  
                        myWhere = "( " + selection + " )";  
                    }  
                    else  
                    {  
                        myWhere = "( " + selection + " ) AND ";  
                    }  
                }  
                else  
                {  
                    myWhere = "";  
                }  
                if (match == ALARMS_ID)  
                {  
                    String segment = uri.getPathSegments().get(1);  
                    rowId = Long.parseLong(segment);  
                    myWhere += " ( " + MyDB.BEAN_ID + " = " + rowId + " ) ";  
                }  
  
                if (values.size() > 0)  
                {  
                    count = db.update(MyDB.TABLET, values, myWhere, selectionArgs);  
                }  
                else  
                {  
                    count = 0;  
                }  
                break;  
            }  
            default:  
            {  
                throw new UnsupportedOperationException("Cannot update URI: " + uri);  
            }  
        }  
        getContext().getContentResolver().notifyChange(uri, null);  
  
        return count;  
    }  
  
    @Override  
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)  
    {  
        SQLiteDatabase db = mDB.getReadableDatabase();  
        SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); //SQLiteQueryBuilder     SQL          
  
        int match = sURIMatcher.match(uri);  
        switch (match)  
        {  
            case ALARMS:  
            {  
                qb.setTables(MyDB.TABLET);  
                break;  
            }  
            case ALARMS_ID:  
            {  
                qb.setTables(MyDB.TABLET);  
                qb.appendWhere(MyDB.BEAN_ID + "=");  
                qb.appendWhere(uri.getPathSegments().get(1));  
                break;  
            }  
            default:  
                throw new IllegalArgumentException("Unknown URI: " + uri);  
        }  
        Cursor ret = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder);  
  
        if (ret != null)  
        {  
            ret.setNotificationUri(getContext().getContentResolver(), uri);  
            Log.d("zyj", "created cursor " + ret + " on behalf of ");  
        }  
        else  
        {  
            Log.d("zyj", "query failed in downloads database");  
        }  
        return ret;  
    }  
  
    private static class MyDB extends SQLiteOpenHelper  
    {  
  
        //         ,     、  、   ...  
        private static final String DATABASE = "test_database";  
        public static final String TABLET = "test_table";  
        public static String ID = "_id";  
        public static String BEAN_ID = "_bean_id";  
        public static String MESSAGE = "_message";  
        public static String TASK_PROGRESS = "_progress";  
  
        private SQLiteDatabase mDB = null;  
  
        private final String msql = "CREATE TABLE IF NOT EXISTS " + TABLET + "( " + ID  
                + " INTEGER PRIMARY KEY AUTOINCREMENT, " + BEAN_ID + " TEXT, " + MESSAGE + " TEXT, " + TASK_PROGRESS  
                + " TEXT )";  
  
        private MyDB(Context context)  
        {  
            super(context, DATABASE, null, 1);  
        }  
  
        @Override  
        public void onCreate(SQLiteDatabase db)  
        {  
            mDB = db;  
            mDB.execSQL(msql);  
        }  
  
        @Override  
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)  
        {  
            //   ,         
        }  
    }  
}  

    MyBean.java 실례 대상
    
public class MyBean  
{  
  
    public int id = 0;  
      
    public String message = null;  
  
    public float progress = 0.0f;  
  
    public MyBean(int id)  
    {  
        this.id = id;  
    }  
      
}  

     MainActivity.java 메인 인터페이스입니다.
     
public class MainActivity extends Activity  
{  
  
    TextView mMessage = null;  
  
    private ContentObserver mDatabaseListener = null;  
    private Handler mHand = null;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
  
        mMessage = (TextView) findViewById(R.id.message);  
  
        init();  
  
        //         ,       Uri  
        getContentResolver().registerContentObserver(MyDataProvider.CONTENT_URI, true, mDatabaseListener);  
    }  
  
    @Override  
    protected void onDestroy()  
    {  
        super.onDestroy();  
        //        
        getContentResolver().unregisterContentObserver(mDatabaseListener);  
    }  
  
    private void init()  
    {  
        mHand = new Handler();  
        //            
        mDatabaseListener = new ContentObserver(mHand)  
        {  
            @Override  
            public boolean deliverSelfNotifications()  
            {  
                System.out.println("deliverSelfNotifications ---------------- ");  
                return super.deliverSelfNotifications();  
            }  
  
            @Override  
            public void onChange(boolean selfChange, Uri uri)  
            {  
                System.out.println("onChange ---------------- " + uri.toString());  
                super.onChange(selfChange, uri);  
            }  
  
            @Override  
            public void onChange(boolean selfChange)  
            {  
                System.out.println("onChange ---------------- ...");  
                super.onChange(selfChange);  
            }  
        };  
    }  
  
    private int count = 0;  
  
    public void onViewClick(View view)  
    {  
        switch (view.getId())  
        {  
            case R.id.add:  
                //       
                ContentValues calues = new ContentValues();  
                calues.put("_bean_id", count++);  
                calues.put("_message", "AAAAAAAAAAAAAAAAAAAAA");  
                calues.put("_progress", 0.0f);  
                getContentResolver().insert(MyDataProvider.CONTENT_URI, calues);  
                break;  
            case R.id.del:  
                //         _bean_id=1、2、3 ,         ,            
                getContentResolver().delete(Uri.parse(MyDataProvider.CONTENT_URI.toString() + "/1"), null, null);  
                getContentResolver().delete(Uri.parse(MyDataProvider.CONTENT_URI.toString() + "/2"), null, null);  
                getContentResolver().delete(Uri.parse(MyDataProvider.CONTENT_URI.toString() + "/3"), null, null);  
                break;  
            case R.id.modify:  
                ContentValues values = new ContentValues();  
                values.put("_message", "ZZZZZZZZZZZZZZZZZZZZZ");  
                //        ,         Uri       /item         
                getContentResolver()  
                        .update(Uri.parse(MyDataProvider.CONTENT_URI.toString() + "/5"), values, null, null);  
                getContentResolver().update(MyDataProvider.CONTENT_URI, values, "_bean_id=?", new String[] { "6" });  
                break;  
            case R.id.query:  
                showMessage(getContentResolver().query(MyDataProvider.CONTENT_URI, null, null, null, null));  
                break;  
        }  
    }  
  
    private void showMessage(Cursor c)  
    {  
        if (c == null)  
        {  
            return;  
        }  
        final StringBuffer sb = new StringBuffer();  
        if (c.getCount() > 0)  
        {  
            while (c.moveToNext())  
            {  
                MyBean bean = new MyBean(c.getInt(c.getColumnIndex("_bean_id")));  
                bean.message = c.getString(c.getColumnIndex("_message"));  
                bean.progress = c.getFloat(c.getColumnIndex("_progress"));  
                sb.append(bean.id + "\t\t\t:" + bean.message + "\t\t\t,progress = " + bean.progress + "
"
); } } c.close(); mHand.post(new Runnable() { public void run() { mMessage.setText(sb.toString()); } }); } }

 
    activity_main.xml 위에는 네 개의 단추가 있고, 아래에는 TextView 디스플레이 컨트롤이 있습니다
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="vertical"  
    android:padding="10.0dip" >  
  
    <LinearLayout  
        android:layout_width="fill_parent"  
        android:layout_height="0dip"  
        android:layout_weight="1"  
        android:orientation="vertical" >  
  
        <Button  
            android:id="@+id/add"  
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content"  
            android:onClick="onViewClick"  
            android:text="Add" />  
  
        <Button  
            android:id="@+id/del"  
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content"  
            android:onClick="onViewClick"  
            android:text="Delete" />  
  
        <Button  
            android:id="@+id/modify"  
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content"  
            android:onClick="onViewClick"  
            android:text="Modify" />  
  
        <Button  
            android:id="@+id/query"  
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content"  
            android:onClick="onViewClick"  
            android:text="Query" />  
    </LinearLayout>  
  
    <ScrollView  
        android:layout_width="fill_parent"  
        android:layout_height="0dip"  
        android:layout_weight="1"  
        android:maxHeight="20dip" >  
  
        <TextView  
            android:id="@+id/message"  
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content"  
            android:textSize="20sp" />  
    </ScrollView>  
  
</LinearLayout>  

마지막으로 안드로이드 매니페스트.xml입니다. 평소와 같습니다. 단지 그 안에 당신이 정의한 콘텐츠 Provider를 적어 놓을 뿐입니다.
Android:name = "com.example.databasetest.MyDataProvider"android:authorities = "com.zyj:497393102"/> 위의 authorities 속성은 반드시 써야 합니다. 바로 위의 MyDataProvider입니다.java에 있는 CONTENTURI의 HOST + ":"+ PORT는 아래에 그려진 것을 보면 비교적 분명하다.
    content://com.example.project:200/folder/subfolder/etc    \---------/ \---------------------------/\---/\--------------------------/    scheme                 host               port        path                    \--------------------------------/                              authority   
그리고 없어졌어요. 직접 운행해서 Uri와 데이터베이스 감청을 느낄 수 있어요.
참조:http://blog.csdn.net/qinjuning/article/details/7047607
http://blog.csdn.net/a497393102/article/details/44223219

좋은 웹페이지 즐겨찾기