Milkcocoaデータストアのメソッドを理解する

自主的に、UWP/.NET Frameworkで使える[Milkcocoa Library](http://qiita.com/matsujirushi/items/e75e2947de88fa661b2e)を書いている人です。

#Milkcocoaって何？

[Milkcocoaサイト](https://mlkcca.com/)から引用。

> **自前でサーバを準備せず**に**クライアントSDK**を介して**データの保存、更新、取得**またPub/Sub通信を行うことが出来ます。

わたしは、次のように解釈しています。

* Milkcocoaサイトでポチポチするだけで、自分でサーバを用意しなくても、**データストア**（データを保管する場所）を設置できる。
* Arduino, ESP8266, mbed, JavaScript向けに[SDK](https://mlkcca.com/document/)が提供されており、これらを使うことでサーバとの通信コードをゴリゴリと作らなくても、Web上にあるMilkcocoaの**データストア**へ**データの追加、変更、削除、送信**や、**データの取得**ができる。
* [Pub/Subモデル](https://ja.wikipedia.org/wiki/%E5%87%BA%E7%89%88-%E8%B3%BC%E8%AA%AD%E5%9E%8B%E3%83%A2%E3%83%87%E3%83%AB)になっており、データが保存されたときに（ほぼ）即時に**通知**することも可能。

他社でも似たようなサービスがありますが、他と比べてデータストア作るまでの手順やSDKがシンプルなので、初めてインターネット上にデータを保管したいといったときにオススメですね。

#脳内イメージ

わたしはMilkcocoaを使うときに、次のようなイメージで全体を捉えているというか考えているというか把握しているというか。

* アプリによって、やりたいことが**「データを操作する」**か**「データを取り出す」**のどちらか、もしくは両方。
* **「データを操作する」**手段は、**追加・変更・削除・送信**がある。手段によって、データストア要素をIDで指定が必要。
* **「データを取り出す」**手段は、**取得**がある。また、データ操作を即時に知る手段として**通知**がある。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/9fc9e299-c175-86fb-a5e7-d4c47da5d01b.png)

#データストアのメソッド
手段に応じた、データストアのメソッドが用意されています。

**「データを操作する」**は、スイッチ押したらデータ追加するとか、定期的に温度をデータ追加する、といったシナリオが多いと思います。
そのような場合は、pushやsendを使います。通知オンリーの場合はsend、保管と通知の場合はpushです。

|使用頻度|手段|メソッド|ID指定|説明|
|:--|:--|:--|:--|:--|
|〇|追加|[push](https://mlkcca.com/document/api-js.html#_ds-push)||データを追加する。|
||変更|[set](https://mlkcca.com/document/api-js.html#_ds-set)|必要|データを変更する。|
||削除|[remove](https://mlkcca.com/document/api-js.html#_ds-remove)|必要|データを削除する。利用非推奨。|
|〇|送信|[send](https://mlkcca.com/document/api-js.html#_ds-send)||データを通知する。データストアに保管しない。|

**「データを取り出す」**は、スイッチを押したら即座に表示するとか、溜まっている温度データをグラフ表示する、といったシナリオが多いと思います。
即座に表示するだけであれば、onを使います。
溜まっているデータを表示するのであれば、streamを使います。
（ほとんどの場合はコレですが）溜まっているデータを取り出した後、即座の変化にも対応するには、streamとonの両方を使います。

|使用頻度|手段|メソッド|ID指定|説明|
|:--|:--|:--|:--|:--|
||取得|[get](https://mlkcca.com/document/api-js.html#_ds-get)|必要|データを取得する。|
|〇|取得（複数）|[stream](https://mlkcca.com/document/api-js.html#_ds-stream)||複数データを取得する。|
||取得（複数）|[history](https://mlkcca.com/document/api-js.html#_ds-history)||複数データを取得する。|
|〇|通知|[on](https://mlkcca.com/document/api-js.html#_ds-on)||データの通知を受け取る。|

#プログラム

**「データを操作する」**は、
> push
> push
> push
> ...

ひたすらpush。（データストアに保管しないときはsend）

**「データを取り出す」**は、
> stream
> on

溜まっているデータを取り出して処理した後に、通知が来たら処理します。
（細かいことを言えば、streamで取り出している最中にデータが追加されたのはどうするの？とかありますが、そこはスルーでw）

具体的なコードは、[CHATサンプル](http://milk-cocoa.github.io/chat/)のソースが参考になります。

```js
        //3."message"データストアからメッセージを取ってくる
        ds.stream().sort("desc").next(function(err, datas) {
            datas.forEach(function(data) {
                renderMessage(data);
            });
        });

        //4."message"データストアのプッシュイベントを監視
        ds.on("push", function(e) {
            renderMessage(e);
        });
```

#最後に

[Milkcocoa SDK for UWP and .NET Framework](http://qiita.com/matsujirushi/items/e75e2947de88fa661b2e)を作っているときに「溜まっているデータを取り出して処理した後に」の必要性には気づいていたのですが、、、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/0c533fe4-0b99-e347-d4af-f670db5879f3.png)

streamが実装されていないという失態orz

えー、言い訳しますと、historyがいるよね！と思い、そっちを実装したのですが、最近、historyじゃなくstreamの方が使いやすいという、勘違いに気づきました。
早々に実装しますので、しばらくお待ちを。