temporaryなめも帳

だらだらと備忘録とか。誰かの為になることをねがって。

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の通知を受け取るために使ってる。