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