iOSでFirebaseを使用して、データベースに対してCRUDを試してみる。

# Xcodeで新規プロジェクトを作成しよう
Create a new Xcode project -> SingleViewApp の順で新規プロジェクトを作成する。
UserInterfaceはStoryBoardにしておきましょう。

# Firebaseのプロジェクトを作成しよう

Firebaseに下記のURLからGoogleアカウントでログインします。
[Firebase](https://firebase.google.com/?hl=ja)

ログインできたら「プロジェクトを追加」ボタンでプロジェクトを追加しましょう。

# Firebaseの設定をしよう

プロジェクトのコンソール画面からアプリを追加することができます。
今回は「iOS」を選択しましょう。
![80edd941.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418332/1d3e6899-e205-3bb8-8369-80d3e61dd83e.png)

アプリのBundleIDを入力します。アプリ名は適当で良いです。
![a6627889.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418332/3ff9da4b-ed1a-6209-4668-85f2f0dc03f3.png)


設定ファイルをダウンロードして、Xcodeプロジェクトに追加します。

その後プロジェクトフォルダまで移動して、ターミナルから、下記コマンドを打ちましょう。

```
pod init
```
CocoaPodsをインストールしていない方は、インストールしてから行ってください。
こちらが参考になります。[CocoaPodsを導入してみた - Qiita](https://qiita.com/tzono/items/b80f6c343355a872dde6)

今回はRealTimeDatabase を使用するので、Podファイルに、以下の文言を追加しましょう。

```
pod 'Firebase/Core'
pod 'Firebase/Database'
```

ターミナルから、下記コマンドでSDKをインストールしましょう。

```
pod install
```

インストールが完了したら、白いプロジェクトファイルが出来上がっていると思いますので、Xcodeで開きます。
![97c2bdae.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418332/b783165d-e535-d2df-3058-cac0a4f44889.png)

AppDelegeteファイルに、画像のように追記します。![スクリーンショット 2019-12-03 15.22.18.png]![18a76768.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418332/aa922c60-6816-3ba5-7eef-634a5c9cfc82.png)

# データベースを作成しよう

左のタブのDataBaseを選択し、RealTimeDatabaseを選択します。
今回はテストモードで開始しましょう。
![スクリーンショット 2019-12-03 15.47.01.png](:storage/2a31a0ee-5c4f-4abe-be0b-1b6e0bc65e20/5859c80c.png)

![5859c80c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418332/10211a85-6a95-3ea0-31f0-6baa99ad8bf3.png)

これで準備完了です！

# データベースに対して操作してみよう

## データを追加してみよう
viewDidLoad に以下のように書いて実行します。

``` swift:
override func viewDidLoad() {
    super.viewDidLoad()
    let ref = Database.database().reference()
  
    // KeyValue型の配列を用意しておきます。
    let user = ["name":"Tarou Yamada", "age":"20", "favorite":"jogging"]
        
    // データを追加します。idは自動で設定してくれます。
    ref.child("Users").childByAutoId().setValue(user)
}
```

Firebaseのコンソール画面に移動すると、データが追加されているのが確認できます！
![51ece462.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418332/d5f083d1-c743-d76b-c975-e2c8bc7a2d37.png)


## データを更新してみよう

先程のデータを更新します。

``` swift:
override func viewDidLoad() {
    super.viewDidLoad()
    
    let ref = Database.database().reference()
    
    // 先程のIDを指定します。(人によって変わるので、自分のDatabaseからコピペしてね)
    let id = "-Lv9asdz8vsqeZSZQdyh"
    // 先程のIDを指定してデータを上書きします。
    ref.child("Users/\(id)/name").setValue("名無しの権兵衛")
}
```

## データを削除してみよう

先程のデータを削除します。

```swift:
override func viewDidLoad() {
    super.viewDidLoad()
    
    let ref = Database.database().reference()
    
    // 先程のIDを指定します。(人によって変わるので、自分のDatabaseからコピペしてね)
    let id = "-Lv9asdz8vsqeZSZQdyh"
    // 先程のIDを指定してデータを削除します。
    ref.child("Users/\(id)").removeValue()
}
```

## データを取得してみよう

### サンプルデータを作ろう

FireBaseのコンソール画面で、データを直接編集することができます。
めんどくさい人は、下記のJSONをファイルにして、FireBaseのインポートしましょう。

```json:test.json
{
  "Users" : {
    "-Lv4cGsQbS3cXDLTErXS" : {
      "age" : "18",
      "favoriteFood" : "クッキー",
      "name" : "田中 花子"
    },
    "-Lv8Lrf3ii9bB5p6rcIc" : {
      "age" : "22",
      "favoriteFood" : "牛丼",
      "name" : "山田 太郎"
    },
    "-Lv8gSwpG-ZkEbPsbORu" : {
      "age" : "13",
      "favoriteFood" : "たこ焼き",
      "name" : "木村 正人"
    },
    "-Lv8vAUr79kcpoygkpDl" : {
      "age" : "26",
      "favoriteFood" : "寿司",
      "name" : "川上 純子"
    }
  }
}
```

### サンプルデータを取得してみよう

下記コードで、Xcodeのコンソールに取得結果が表示されます。

```swift:
override func viewDidLoad() {
    super.viewDidLoad()
    
    let ref = Database.database().reference()
    
    // データの変更を監視(observe)してるため、変更されればリアルタイムで実行されます。
    ref.child("Users").observe(.value) { (snapshot) in
        // Users直下のデータの数だけ繰り返す。
        for data in snapshot.children {
            let snapData = data as! DataSnapshot
            
            // Dictionary型にキャスト
            let user = snapData.value as! [String: Any]
            print(user)
        }
    }
}
```

# まとめ
環境の設定から、CRUDの基本的なところまでは押さえられたはず。 次はFirebaseを使って簡単なアプリを作ってみたい。