ContentProviderをadbから直接実行するcontentコマンド

from. [Yukiの枝折 - Android:contentコマンドでContentProviderを呼び出す](http://yuki312.blogspot.jp/2013/02/androidcontentcontentproviderdb.html)

Intro
-------------
Android4.1.1からadb shellからContentProviderへ直接リクエストを送信するcontentコマンドが追加された. 
ContentProviderのテストや連携先ContentProviderの情報取得をadbから手軽に実行でき, コードを書く必要はない. 

content command:

```bash
content query --uri content://yuki.authority/
```

contentコマンドはContentProviderへの命令をコマンドラインで指定・実行する. 
ContentProviderがデータベースを扱うのであればレコードへのCRUD操作が実行されるといった具合に, contentコマンドの命令はアプリからのContentProvider呼び出しと同じで透過に扱える. 

データベースの編集という用途ではSQLite3コマンドがベストな選択肢であるが, SQLite3コマンドの対象がデータベースなのに対して, contentコマンドの対象はContentProviderとなる. 
これはつまり, ContentProviderの動作確認ツールとして使用可能であり, その透過性からContentProviderを実行してのContentObserverを確認すると行った用途にも使える.  

Usage
------------------------------------

### help

contentコマンドの使用方法を調べるコマンド

```bash
adb shell content
```


### query

ContentProviderのqueryを実行する. 
引数についてはContentResolver.queryに渡す引数のそれと同じ感覚で使える. 

```bash 
adb shell content query --uri <URI> [--projection <PROJECTION>] [--where <WHERE>] [--sort <SORT_ORDER>]
```

### insert

ContentProviderのinsertを実行する. 

```bash
adb shell content insert --uri <URI> --bind <BINDING> [--bind <BINDING>...]
```

### update

ContentProviderのupdateを実行する. 

```bash
adb shell content update --uri <URI> [--where <WHERE>]
```

### delete

ContentProviderのdeleteを実行する. 

```bash
adb shell content delete --uri <URI> --bind <BINDING> [--bind <BINDING>...] [--where <WHERE>]
```

### Arguments

共通するコマンド引数については下記. 

#### URI

コンテンツプロバイダのURI

例

```bash
--uri content://hoge.authority
```

#### PROJECTION

検索対象のカラム名を指定する. 指定方法は 

```bash
<COLUMN_NAME>[:<COLUMN_NAME>...]
```

例

```bash
column1:column2:column3
```

#### WHERE

SQLのWHERE句を指定します. 

例

```bash
--where "column1='where_string'"
```

#### SORT_OREDER

ソート対象の列を指定します. 

例

```bash
--sort "column1 DESC"
```

#### BINDING

次のフォーマットに従い, ContentValuesを作る感覚でカラムにバインドする情報を指定する. 

```bash
<COLUMN_NAME>:<TYPE>:<COLUMN_VALUE>
```

TYPEには次の型が指定可能. 

 - b : boolean
 - s : string
 - i : integer
 - l : long
 - f : float
 - d : double

例

```bash
column:s:new_string
```


Tests
--------------------------

動作確認の対象となるContentProviderとデータベーステーブルの情報は下記. 

### ContentProvider

#### Authority

`yuki.authority`

### Table

#### Scheme

| cid | name | type   |
|----|-------|--------|
|0   |  _id  | INTEGER|
|1   |number | INTEGER|

#### Contents

| _id     |  number     |
|---------| ------------|
|1        |   1416078507|
|2        |   1355288181|
|3        |   380734541 |
|4        |   254152153 |
|5        |   18301077  |


### content commands

#### query

```bash
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"
```

Result:

```bash
Row: 0 _id=3, number=380734541
Row: 1 _id=2, number=1355288181
Row: 2 _id=1, number=1416078507
```

#### insert

```bash
content insert --uri content://yuki.authority/ --bind number:i:1234567 yuki.authority/ --bind number:i:1234567
```

Result: (insert結果をqueryで確認)

```bash
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

```bash
content update --uri content://yuki.authority/ --bind number:i:9999 yuki.authority/ --bind number:i:9999
```

Result: (update結果をqueryで確認)

```bash
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

```bash
content delete --uri content://yuki.authority/ --where "_id=1" yuki.authority/ --where "_id=1"
```

Result: (delete結果をqueryで確認)

```bash
content query --uri content://yuki.authority/ --projection _id:number com.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
```

以上.