天天看點

ContentProvider(内容提供者),UriMatcher(Uri比對器)

UriMatcher:工具類來幫助比對内容提供商的uri

addURI(String authority, String path, int code)

參數1:包名

參數2:暗号,一般都寫入表明

參數3:進行比對的元件,必須積極的

添加一個URI比對,傳回此URI時的代碼比對。URI節點可能精确比對字元串,标記“*”比對任何文本,或令牌“#”相比對數字。

public static final int SUCCESS = ;
    /**
     * 建立一個保安,檢查uri的規則,如果uri比對失敗 傳回-1
     */
    // UriMatcher.NO_MATCH 不比對
    static UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    static {
        mUriMatcher.addURI("com.itheima.db", "account", SUCCESS);
    }

//利用内容提供者的解析器,通知内容觀察者資料發生了變化
getContext().getContentResolver().notifyChange(uri, null);
           
ContentProvider:内容提供者的作用

應用程式建立的資料庫預設都是私有的,别的應用程式不可以通路裡面的資料。

如果有需求把自己應用程式私有的資料庫暴露給别的使用者增删改查,就需要使用内容提供者

public abstract class ContentResolver :通過URI來,通路應用程式内容

ContentResolver 是個抽象類 初始化:

ContentResolver resolver = getContentResolver();

ContentValues :該類用于存儲一組值,ContentResolver 可以處理。

// 得到内容提供者的解析器
        ContentResolver resolver = getContentResolver();
        // 内容提供者 規定頭寫"content://"
        Uri uri = Uri.parse("content://com.content_provider.db/account");
        ContentValues values = new ContentValues();
        // 添加資料
        values.put("name", "zhangsan");
        values.put("money", );
        // 通過内容解析器讓内容提供者添加一條資料
        resolver.insert(uri, values);
           
ContentObserver:收到電話支援更改内容。必須實作的對象添加到ContentObservable

建立一個觀察者,傳遞 handler 來處理程式運作

public ContentObserver(Handler handler) {
        mHandler = handler;
    }
           

registerContentObserver(@NonNull Uri uri, boolean notifyForDescendents,@NonNull ContentObserver observer)

參數2:true代表進行通知

注冊一個觀察者類時回調資料确定的特定URI更改内容。

onChange(boolean selfChange):内容發生改變時調用此方法,提醒内容進行更改

示例一:

getContentResolver().registerContentObserver(uri, true, new ContentObserver(new Handler()) {
            @Override
            public void onChange(boolean selfChange) {
                super.onChange(selfChange);
                System.out.println("内容觀察者");
            }
        });
           

示例二:

public class MainActivity extends Activity {
    private MyObserver observer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Uri uri = Uri.parse("content://sms");
        observer = new MyObserver(new Handler());
        getContentResolver().registerContentObserver(uri, true, observer);
    }
    private class MyObserver extends ContentObserver{

        public MyObserver(Handler handler) {
            super(handler);
        }

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

繼續閱讀