UriMatcherがどんなものか簡単に知りたい人向け。

 UriはURLのような形式で階層的に情報を記述できる仕組みで、有名なのがhttp://www.google.com/のようなURL。
 UriMatcherは、それぞれUriを解析してマッチ(一致)したら登録した数値を返してくれる。
 Uriは、数値がある場合と数値がない場合がある。
content://jp.example.to.MyContentsProvider/tablename/1 数値がある例
content://jp.example.to.MyContentsProvider/tablename 数値がない例
 それぞれ区別してマッチさせることができる。
 UriMatcherでは、文字のワイルドカードとして*(アスタリスク)が利用でき、数字のワイルドカードとして#が利用できる。文字のワイルドカードに数値は含まれないので、それぞれ区別することができる。
 例えば数値がある例は下記のように登録しておくと、マッチして1の数値が返る。
it.addURI("jp.example.to.MyContentsProvider", "tablename/#", 1)
 このようにワイルドカードを利用しても文字のワイルドカードなので、これにはマッチしない。
it.addURI("jp.example.to.MyContentsProvider", "tablename/*", 3)
 階層を深くすることもできる
content://jp.example.to.MyContentsProvider/tablename 階層が深くない例
content://jp.example.to.MyContentsProvider/tablename/subname 階層が深い例
 文字のワイルとカードを利用すると、このどちらにもマッチさせることもできる。
 以下のようにするとtablename/ 以降の階層が文字だけであれば、なんでもマッチしてくれる。
it.addURI("jp.example.to.MyContentsProvider", "tablename/*", 3)
 このように、Uriが完全に一致、特定の階層まで一致、さらに数値があるかどうかなどを判別させることができる。
 またUriには階層部分だけ取得するといったようなことができるので、階層に記述された文字列を取得したり、数値だけを取得するというようなことができる。その方法は具体的にはこちら。
 ContentsProviderでUriを使っている場合には、
content://オーソリティ(プロバイダを区別する名前)/テーブル名/カラムを表す数値
という感じに記述されているはず。

val uri01: Uri = Uri.parse("content://jp.example.to.MyContentsProvider/tablename/subbame/1")

//NO_MATCHは-1。マッチしないときに-1を返す
val matcher: UriMatcher = UriMatcher(UriMatcher.NO_MATCH).also {
    // content://jp.example.to.MyContentsProvider/tablename/1 にマッチ
    it.addURI("jp.example.to.MyContentsProvider", "tablename/#", 1)
    // content://jp.example.to.MyContentsProvider/tablename にマッチ
    it.addURI("jp.example.to.MyContentsProvider", "tablename", 2)
    // content://jp.example.to.MyContentsProvider/tablename/subbame に下記の二つはマッチするが最初に登録した3が返る
    it.addURI("jp.example.to.MyContentsProvider", "tablename/*", 3)
    it.addURI("jp.example.to.MyContentsProvider", "tablename/subname", 4)
}

when (matcher.match(uri01)) {
    -1 -> {
        //マッチしなかった時の処理
    }
    1 -> {
        //何らかの処理
        // content://jp.example.to.MyContentsProvider/tablename/1 の最後の数値が取得できる
//この場合は1が入る
val num: Int = uri01.lastPathSegment.toInt()
} }