スピードランナースマートフォン用の表示で見る遥かへのスピードランナーシリコンバレーでAndroidアプリの開発してます。コンピュータービジョン・3D・アルゴリズム界隈にもたまに出現します。この広告は、90日以上更新していないブログに表示しています。2010-10-06数値キーでCursorJoinerを使うandroidandroid.databaseパッケージにCursorJoinerというクラスがあります。Provider同士のデータをJoinさせてあげるときに使うことができます。}みたいな感じで使うわけですが、実際こいつが何をやってるかというと、2つのカーソルのJoin対象のキーカラムを比較して、小さい方のカーソルを順番に進めていって、イテレーションのループの中で両方のカーソルに存在するデータなのか、どちらか一方のカーソルにしか存在しないデータなのかの情報を提供してあげてるだけです。Provider経由で触ることになるので、自前のDBとOSのDB(あるいは他アプリのDB)をJoinさせたいときは、このCursorJoinerを使って擬似的にJoinしてあげるのが、ベターなのかなあと思ってます。既存のCursorJoinerの問題点こんな感じで割と便利なCursorJoinerですが、一つ問題があります。CursorJoinerでも触れられていますが、両カーソルのキー値を比較するときに、キーが数値型であっても、文字列比較してしまっているという点です。これはどういうことかというと、たとえばCursorAのキーが1,5,10と並んでいて、CursorBのキーが1,10,20と並んでいるときに、キー=1のデータはResult.BOTH(両方のカーソルにあるデータ)として取得できるのですが、両Cursorを順番に進めていく過程で、CursorA=5,CursorB=10の時に5>10と判定してしまって、小さい(と判断された)CursorBを20に進めてしまうのです。そのため、CursorA=10,CursorB=10となるタイミングがなくなって、キー=10はResult.BOTHで取得することができません。キー値は大体Long型であることが多いのでこれは困ります。いうわけで、数値型のキーを扱えるようにCursorJoinerを修正してみます。(不幸なことにCursorJoinerはfinalなクラスで、継承できないので、CursorJoinerをマルっとコピーして必要な部分だけ修正します。}}これで、数値型のキーでCursorをJoinさせることができるようになります。MatrixCursorCursorJoinerを使って、両カーソルに存在するデータだけを新たなカーソルとして取得したいときは、僕はMatrixCursorを使ってます。他で使っているCursorAdapterを使い回したいときとかに便利です。注:cursor2valuesはCursorをString[]に変換する独自のメソッドです。result;まとめContetProvider同士のデータをJoinさせたいときはCursorJoinerが使える。CursorJoinerはそのままでは数値型のキーをJoinして使えないが、今回の修正版を使うことでそれができるようになる。CursorJoinerを使った結果をCursorで取得したいときはMatrixCursorが使える。データをJoinして扱いたい場合、パフォーマンスに拘った方法でやろうとすると、現状では上記が精一杯の対応なのではないかと思います。OSではとりあえず我慢、でしょうか。(1)はてなブログをはじめよう!thorikawaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。