iOS側の操作だけで出来る！Swift×Azure入門

#はじめに
以前書いた記事、[Swift×Azureをやってみたらすごく便利っぽい！](http://qiita.com/ktanaka117/items/f5d2560b910a49b2865a)で紹介したようにAzureは便利っぽいです。
以前の記事では本当の触りの紹介だけでしたが、その後サンプルソースを元にデータベースとのデータのやり取りをやってみたのでどうやるのかを紹介します。

参考にしたのは以下の公式のリファレンス。
[モバイル サービス向け iOS クライアント ライブラリの使用方法](http://azure.microsoft.com/ja-jp/documentation/articles/mobile-services-ios-how-to-use-client-library/#inserting)
リファレンスではObjective-Cですが、Swiftで書いていきます。

#今回扱うクラスの紹介
##MSTable
MSTableはテーブル参照用のクラスです。
データの挿入、取得、更新、削除はこのクラスのインスタンスメソッドで行います。
データの取得はNSPredicateやクエリを用いて条件を追加して行うことができます。
簡単なものはNSPredicate、複雑なものはクエリを用いて行います。
クエリはWindowsAzureMobileServices.frameworkにあるMSQueryを使うと簡単です。

##MSQuery
MSQueryはWindowsAzureMobileServices.frameworkに入っているクエリのクラスです。
データの検索条件を指定することができます。
昇順、降順、何個のデータを取ってくるか、何番目から取ってくるか、このフィールドの値を取ってきたい、など。

#テーブルの扱い方
##データの挿入
挿入するデータはNSDictionary型で用意します。
tableはMSTableのインスタンスで、プロパティとして宣言してあります。
MSTableクラスのインスタンスメソッドの
```insert(item: NSDictionary, completion: MSItemBlock)```
メソッドでデータベースのテーブルに値を挿入することができます。

```
let itemToInsert: NSDictionary = ["text": "Swiftたのしい", "complete": false]

table!.insert(itemToInsert) { (result, error)  in
    // なにかする。とりあえず結果をプリント。
    println("result: \(result)")
}
```

##データの取得
###データの全件取得
MSTableクラスのインスタンスメソッドの
```readWithPredicate(completion: MSReadQueryBlock)```
メソッドでデータベースのテーブルの値を全件取得することができます。

```
table?.readWithCompletion() { (result, totalCount, error)  in
    println("result: \(result)")
}
```

###NSPredicateを用いる場合
NSPredicateを使ってフィルターをかけることができます。
MSTableクラスのインスタンスメソッドの
```readWithPredicate(item: NSDictionary, completion: MSReadQueryBlock)```
メソッドでデータベースのテーブルの条件の一致する値を取得することができます。
以下の例はcompleteフィールドの値がfalseのもの

```
let predicate = NSPredicate(format: "complete == false" )

table!.readWithPredicate(predicate) { (result, totalCount, error)  in
    println("result: \(result)")
}
```

###MSQueryを用いる場合
MSQueryを使ってより複雑なフィルターをかけることができます。
以下はデータの作成日を昇順でソートして、テーブルの1番目から2個の値をtextフィールドから取得する例です。

```
let query = MSQuery(table: table) 

// 以下の二つのメソッドはそれぞれ昇順、降順にソートするメソッド。
query.orderByAscending("__createdAt")
//query.orderByDescending("__createdAt")

// テーブルの何番目から値を取ってくるか。
query.fetchOffset = 1

// テーブルから何個の値を取ってくるか。
query.fetchLimit = 2

// textフィールドの値のみを取得
query.selectFields = ["text"]

query.readWithCompletion({ (result, totalCount, error) in
    println("result: \(result)")
})
```

##データの更新
データの更新はMSTableのインスタンスメソッド

```
update(item: NSDictionary, completion: MSItemBlock)
```

を使います。

例はこんな感じ。
item変数に代入するresultはテーブルから取得したデータです。
取得した値に対して変更を加えて、その変更した値をupdateメソッドの引数として渡します。
readメソッドで取得したresultの構造は配列のの中に連想配列が入った二次元配列なので、以下の例ではとりあえずresultのindex0番の値を書き換えてやるようにしています。

```
var item: NSMutableDictionary = (result as NSArray).objectAtIndex(0) as NSMutableDictionary
item.setObject(true, forKey: "complete")

self.table?.update(item) { (result, error) in
    println("result: \(result)")
}
```

##データの削除
削除も更新と同じように行います。
使うメソッドはこちら。

```
delete(item: NSDictionary, completion: MSItemBlock)
```

例としてはこちら。

```
var item: NSDictionary = (result as NSArray).objectAtIndex(0) as NSDictionary
self.table?.delete(item) { (result, error) in
    println("result: \(result)")
}
```

#まとめ
自分は現在Webであったりサーバーであったりデータベースに関する知識はほとんど無く、iOSだけやっていますが、そんな自分でも簡単にAzureでデータベース連携を実装することができました。
敷居が低くDB連携できるので、君もレッツAzure。