2013年9月17日火曜日

ふと思った

SQLの発行は全部コンテントプロバイダに集約すればいいんじゃね?

なんでかっていうと、コンテントプロバイダは別プロセスの中のとあるスレッドで起動されるから。

集約っていうのは、あるSQLを発行、つまりselectやDMLに関する全てのケースを、
コンテントプロバイダ内で制御するということ。
より具体的にいうと、コンテントプロバイダ内でコーディングしたものだけを発行できる形にするということ。
こうすれば、アプリケーション上からstaticなコンテントプロバイダのオブジェクトを参照して、そのオブジェクトを通してSQLを発行するだけでいい。
ストアドプロシージャみたいな形だね。ついでにゲートキーパーの役割も持つ。

SQLiteのトリガーだと生SQLを発行することになるので、
プレースホルダー機能をもつcontentresolverクラスのメソッドが使えない。
簡単なSQLインジェクションをトリガーで行ってしまう可能性があるということ。
なので、テーブル毎にDMLの制御を作ればいいんじゃないだろうか。
どのテーブルにSQLを投げているかは引数のUriで判定できるし。

満たすべき仕様は以下。
1.常に同じコンテントプロバイダオブジェクトを使うこと。
2.常に同じSQLiteDatabaseオブジェクトを使うこと。
3.順次発行ができているか確認すること。
4.databaseの変更を受け取れるコールバックを実装すること。

これはコンテントプロバイダ内のonCreateでstaticなメンバとして扱えばいいのかな?
というわけでやってみる。

0 件のコメント:

コメントを投稿