ContentQueryMapを使ってみる
AndroidのPowerManager周りのソースコードを読んでると出てきたので、調べてみた。 このCotentQueryMapクラスは、Queryで対象としたデータをキャッシュに持っておくことができる。ソースを読む限り、元データはContentProviderが管理しているとして、「欲しい時に毎回クエリかけるのメンドくさいし遅い」みたいな時に利用できそう(だと理解した。) ※速度は測ってないのでわかんないが。
ContentQueryMapの使い方は、コンストラクタに渡したカーソルのデータをgetValues()メソッドで拾う感じ。もちろん内部でContentProviderのデータの更新を検知していて、取れるデータは最新のものとなる。(コンストラクタの引数に都度updateするかのフラグがある。)
以下使い方。
ContentQueryMap mContentQueryMap; private void use(){ ContentValues value = mContentQueryMap.getValues(STAY_ON_WHILE_PLUGGED_IN); // ...省略 } private void init(){ Cursor settingsCursor = resolver.query(Settings.System.CONTENT_URI, null, "(" + Settings.System.NAME + "=?)", new String[] { STAY_ON_WHILE_PLUGGED_IN }, null); contentQueryMap = new ContentQueryMap(settingsCursor, Settings.System.NAME, true, mHandler); contentQueryMap.addObserver(new SettingsObserver()); } private class SettingsObserver implements Observer{ public void update(Observable o, Object arg) { // updateがあれば通知される } }
コンストラクタの第三引数が、上記のContentProviderのアップデート通知に合わせて更新するかどうかのフラグ。これをtrueにしておかなくても、requery()呼べば更新はできる。 第四引数のHandlerは内部でContentObserverを利用してContentProviderの通知を受け取るために使ってる。