2013/02/14

Android:contentコマンドでContentProviderを呼び出す

Android4.1.1以降、コマンドラインユーティリティにcontentコマンドが追加されました。

サンプルコマンド:
$ content query --uri content://yuki.authority/
このコマンドは、コンテンツへのCRUD操作をコンテンツプロバイダ経由で実行します。
例えば、データベースレコードの検索や削除などが可能です。

SQLite3コマンドでも同様にデータベースの編集が可能ですが、
SQLite3コマンドの対象がデータベースであるのに対して、contentコマンドの対象はコンテンツプロバイダです。
これはつまり、
  • コンテンツプロバイダの簡単な動作確認として使用可能
  • コンテンツプロバイダを経由するため、コンテンツオブサーバへの通知も実行される
といったメリットがあります。


●contentコマンドの使い方

使い方は
& adb shell content
と入力すれば使い方が表示されます。

【query】
$ adb shell content query --uri <URI> [--projection <PROJECTION>] [--where <WHERE>] [--sort <SORT_ORDER>]

【insert】
$ adb shell content insert --uri <URI> --bind <BINDING> [--bind <BINDING>...]


【update】
$ adb shell content update --uri <URI> [--where <WHERE>]


【delete】
$ adb shell content delete --uri <URI> --bind <BINDING> [--bind <BINDING>...] [--where <WHERE>]

<URI>
    コンテンツプロバイダのURI
    (例)--uri content://hoge.authority

<PROJECTION>
    検索対象のカラム名を指定します。指定方法は <COLUMN_NAME>[:<COLUMN_NAME>...]
    (例)column1:column2:column3

<WHERE>
    SQLのWHERE句を指定します。
  (例)--where "column1='where_string'"

<SORT_OREDER>
    ソート対象の列を指定します。
   (例)--sort "column1 DESC"

<BINDING>
    次のフォーマットに従い、カラムにバインドする情報を指定します。
  <COLUMN_NAME>:<TYPE>:<COLUMN_VALUE>
  <TYPE>にはb - boolean, s - string, i - integer, l - long, f - float, d - doubleが指定可能です。
  (例)column:s:new_string


●動作確認

動作確認の対象となるテーブル情報は下記。

・Authority
yuki.authority

・テーブル情報
cid   name     type  
----  -------  --------
0     _id      INTEGER
1     number   INTEGER

・テーブル内容
_id         number
----------  ------------
1           1416078507
2           1355288181
3           380734541
4           254152153
5           18301077

【query】
# content query --uri content://yuki.authority/ --projection _id:number --where "_id BETWEEN 1 AND 3" --sort "_id DESC"
_id:number --where "_id BETWEEN 1 AND 3" --sort "_id DESC"
Row: 0 _id=3, number=380734541
Row: 1 _id=2, number=1355288181
Row: 2 _id=1, number=1416078507

【insert】
# content insert --uri content://yuki.authority/ --bind number:i:1234567
yuki.authority/ --bind number:i:1234567
-結果確認-
# content query --uri content://yuki.authority/ --projection _id:number --where "number=1234567" --sort "_id DESC"
_id:number --where "number=1234567" --sort "_id DESC"
Row: 0 _id=6, number=1234567

【update】
# content update --uri content://yuki.authority/ --bind number:i:9999
yuki.authority/ --bind number:i:9999
-結果確認-
# content query --uri content://yuki.authority/ --projection _id:number --where "number=9999"
_id:number --where "number=9999"
Row: 0 _id=1, number=9999
Row: 1 _id=2, number=9999
Row: 2 _id=3, number=9999
Row: 3 _id=4, number=9999
Row: 4 _id=5, number=9999
Row: 5 _id=6, number=9999

【delete】
# content delete --uri content://yuki.authority/ --where "_id=1"
yuki.authority/ --where "_id=1"
-結果確認-
# content query --uri content://yuki.authority/ --projection _id:number
om.example.testcprovider/ --projection _id:number
Row: 0 _id=2, number=9999
Row: 1 _id=3, number=9999
Row: 2 _id=4, number=9999
Row: 3 _id=5, number=9999
Row: 4 _id=6, number=9999

以上です。