【Swift】Firebase Cloud Firestoreに値を追加・取得・削除をする

Firebase

はじめに

本記事は、Firebase Cloud Firestore(以降Firestore)の基本的な使い方について解説していきます。

FirebaseやCloud Firestoreの設定方法は以下の記事をご覧ください。

本記事の概要

本記事では、Firestoreについて以下のようなことを説明してきます。

・Firestoreに関する知識

・Firestoreにデータを追加、登録、削除する方法

Firestoreに関する知識

ここではFirestoreを利用するために必要な知識を説明していきます。それでは、説明に移っていきます。

基本事項

Firestoreは、NoSQLというスキーマレスな構造です。MySQLやPostgreSQLのようなリレーショナル型のSQLとは違う形になります。イメージとしては以下の画像のような形になります。今回利用するFirestoreはkey、value型になっているのでイメージとしてはJson形式のような形になります。

Firestoreのデータ型

Firestoreは、NoSQLドキュメント指向データベースです。SQLのデータベースとは異なり、テーブルや行はありません。そこで、データは「ドキュメント」に格納し、それが「コレクション」にまとめられます。ここで何を言っているのだと思うとおもいます。なので細かく説明をしていきます。

まず全体の構造について確認してきます。FirestoreはNoSQLなので、Jsonのような形式となります。以下に例を記載します。

Firestoreのデータ例

{
  "User": {
    "0001": {
      "name": "山田太郎",
      "age": "20",
      "email": "example@mail.com"
    },
    "0002": {
    ...
    }
    ...
  }
}

次に、「コレクション」「ドキュメント」「データ」について説明します。

Firestoreの基本は3階層です。一番上の階層のことを「コレクション」上記のFirebaseのデータ例の中では,”User”のことを指しています。

2階層目を「ドキュメント」と呼びます上記のFirebaseのデータ例の中では,”0001″、”0002″のことを指しています。

3階層目を「データ」と呼びます。ドキュメント以下に入っているものをデータと呼びます。上記のFirebaseのデータ例の中では、”name”、”age”、”email”です。

これで初めに説明した”データは「ドキュメント」に格納し、それが「コレクション」にまとめられます。”の意味が少しわかったのではないでしょうか。イメージとしては以下のようなイメージになります。

Firestoreのデータを追加、削除、取得する方法

ここからは、Firestoreにデータを追加、削除、する方法について解説していきます。
前提条件として、Firestoreを利用するための初期設定が完了し、Firestoreが利用できることを、前提条件とします。

Firestoreにデータを追加

まず、データの追加について解説します。データの追加方法は2つあります。

1.コレクションやドキュメントを作成するときにデータを追加する方法
2.既存のドキュメントにデータを追加する方法

1.コレクションやドキュメントを作成するときにデータを追加する方法

まず、コレクションやドキュメントを作成するときにデータを追加していきます。この方法では、新規にコレクションやドキュメントを作成しそこに、初期値としてデータを追加していきます。もし、同一のドキュメントがあった場合は、その内容を上書きしてしまうことに注意をしてください。

基本的な記載方法は以下になります。

db.collection("コレクション名").document("ドキュメント名").setData("データ"){
 ...//処理結果を受け取る
}

「db.collection(“コレクション名”).document(“ドキュメント名”)」でコレクションとドキュメントを指定します。指定したコレクションとドキュメントがない場合は作成しますが、ある場合は上書きをします。

実際に利用する際の具体的なコードは以下になります。

let db = Firestore.firestore()
let testRef = db.collection("User").document("00001").setData([      
  "test":[
    "Name": "山田太郎",
    "age": 20,
    "email":"example@mai.com"
  ]
]){ error in
  if let error = error {
    print("\(error)")
    print("データ追加失敗"
  }else{
    print("データ追加に成功しました。")
  }
}
2.既存のドキュメントにデータを追加する方法

次に既存のドキュメントにデータを追加する方法です。

まず基本的な記載方法は以下になります。

db.colection("コレクション名").documents("ドキュメント名").updateData("データ"){
  ...//処理結果を受け取る
}

こちらはドキュメントを更新する処理になります。コレクションやドキュメントがない場合は、追加の処理は失敗となります。ドキュメント存在する場合のみデータを追加することができます。

具体的な使い方は以下のような形になります。

let testRef = db.collection("User").document("00001")
    
testRef.updateData([
  "test":[
    "Name": "山田太郎",
    "age": 20,
    "email":"example@mai.com"
  ]
]){ error in
  if let error = error {
    print("\(error)")
    print("データ追加失敗")
  }else{
    print("データ追加に成功しました。")
  }
}

Firestoreからデータを取得する方法

Firestoreからデータを取得する方法を説明します。基本的なコードは以下のよう形で書きます。

db.collection("コレクション名").document("ドキュメント名").getDocument { 
  //取得したドキュメントに対する処理
  ...
}

この取得はドキュメント内のすべての値を取得する方法になります。取得した値はコールバック処理を書いて取得します。

具体的な利用方法は以下のような形になります。

db.collection("users").document("0001").getDocument { (document, error) in
    if let error = error {
        print("エラーが発生しました: \(error.localizedDescription)")
        return
    }

    if let document = document, document.exists {
        let data = document.data()
        let name = data?["name"] as? String ?? "No Name"
        let age = data?["age"] as? Int ?? 0
        print("名前: \(name), 年齢: \(age)")
    } else {
        print("指定したドキュメントは存在しません")
    }
}

Firestoreから値を削除する

次にFirestoreから値を削除する方法について説明します。以下2つのパターンの削除について説明します。

1.ドキュメントそのものを削除する方法
2.ドキュメント内の特定のフィールドを削除する方法

1.ドキュメントそのものを削除する方法

まず初めにドキュメントごと削除する方法について説明します。ドキュメントごと削除する方法は、上記でおこなってきた、setDataやupdateDataと同様に、deleteのメソッドが作成されています。

基本的な記述の方法は以下のようになります。

db.collection("コレクション名").document("ドキュメント名").delete {
//処理結果を結果を受け取る
 ...
}

こちらを実施すると、ドキュメント以下の値が削除されます。具体的な例を以下に記載します。

まず具体的なソースコードが以下のような形になります。

let db = Firestore.firestore()
db.collection("test").document("00001").delete(){ error in
    if let error = error {
        print("Error removing document: \(error)")
    } else {
        print("Document successfully removed!")
    }
}

上記の処理を実行した時のDBの状態を説明します。

Firestore初期状態

{
  "test":{
    "00001":{
      "Name":"山田太郎",
      "age":"20",
      "email":"example@mail.com"
    }
  }
}

上記コード実行後

{
  "test":{
  }
}
2.ドキュメント内の特定のフィールドを削除する方法

次にドキュメント内の特定のフィールドを削除する方法を説明します。今回はこれまでと違い、updateDataメソッドを利用して、指定のフィールドを削除します。

まず基本的な記載の仕方はいかになります。

db.collection("コレクション名").document("ドキュメント名").updateData([
    "フィールド名": FieldValue.delete()
]) {
 //結果取得後の処理
 ...
}

具体的なコードを以下のように記述します。

let db = Firestore.firestore()
db.collection("test").document("00001").updateData([
    "Name": FieldValue.delete()
]) { error in
    if let error = error {
        print("Error deleting field: \(error)")
    } else {
        print("Field successfully deleted!")
    }
}

上記のコードを実行した時のDBの変化は以下のようになります。

Firestore初期状態

{
  "test":{
    "00001":{
      "Name":"山田太郎",
      "age":"20",
      "email":"example@mail.com"
    }
  }
}

上記コード実行後

{
  "test":{
    "00001":{
      "age":"20",
      "email":"example@mail.com"
    }
  }
}

“00001”の中の”Name”が削除された形になります。

最後に

今回はFirestoreに値を、追加、取得、削除する方法について説明しました。Firestoreはとても簡単に利用できるので、ぜひ皆さんも利用してみてください。

よろしければ他の記事もみていただけるとありがたいです。

プロフィール

SIer勤めのエンジニア
アプリケーションエンジニアとして、WebやiOSなどのアプリ開発をメインにしてます

tomaをフォローする
FirebaseSwift