質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Swift

    8727questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    4910questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • Firebase

    897questions

    Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Firebase内のArrayに関するルール

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 185

midori0822

score 51

お世話になっております。

firebaseのRDBにArray型のデータを保存したいのですがうまくいきません。

リンク内容リンク先の内容に沿って配列の保存をしようとしていました。
しかし、今回自分が使用している配列はArray型です。機能的に要素の順番が重要でありDictionary型での保存は好ましくありません。
なのでArray型での保存方法を調べています。

公式ドキュメントにはArray型も保存できるとあるのですが

".validate":"newData.isNumber()"


のようにisArray()という物があるわけでもなく、array型のRDB保存について詳しく記載しているページもありませんでした。

理想はswiftでの.appendや.insertのような操作ができることです。
そうでなくとも、配列まるごと保存できれば大丈夫です。

必要な情報があればお聞きください。解決法がわかる方、詳細なページを知っている方、返信お待ちしております。


追記

例えば
var array = ["apple","banana","orange","melon"]
この配列をRDBで保存するときどのようにしますか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • gekijin

    2018/10/14 12:27

    「firebaseのRDB」とは、Realtime Databaseを指していますか?

    キャンセル

  • midori0822

    2018/10/14 14:09

    RDBはRealtime Databaseのことを指します。

    キャンセル

回答 1

checkベストアンサー

+2

Realtime DB(以下RTDB)にarrayをsetすると、keyがインデックス、valueが値のオブジェクトとして保存されます。

self.ref.child("arrays").child("sample").setValue(["apple","banana","orange","melon"])

// 結果
arrays:
  sample:
    0: "apple"
    1: "banana"
    2: "orange"
    3: "melon"


このデータをgetすると、ちゃんとarray(["apple","banana","orange","melon"])として取得できます。
どうやらRTDBでは、「キーがすべて0以上のnumberの場合は配列とみなす」という規則が適用されているようです。

尚RTDBにappendinsertなどの機能はありません。
配列を丸ごと更新するのがよさそうです。

RTDBにとってはkeyのインデックスもただのkeyなので、上記のコードに続けて以下のような処理をすれば、appendっぽいことはできることはできます。

self.ref.child("arrays").child("sample").child("4").setValue("grape")

// 結果
arrays:
  sample:
    0: "apple"
    1: "banana"
    2: "orange"
    3: "melon"
    4: "grape" // ←appendっぽく追加された


ただこの処理は当然、「現在の配列長」を取得する必要があり、その実装が間違っていると上書きすべきでないデータを上書きしてしまう可能性もあります。
素直にarrayにappendで追加したものを、RTDBにまるっとsetするのがよいかと思われます。

※追伸
RDBですと、一般的には「リレーショナルデータベース」の略で使われることが多いです。
Firebase界隈では、RTDBの方が一般的のようです。
rtdb vs firestore
のように使われていました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/16 00:18

    返信遅れて申し訳ございません。

    "sample": { ".validate": "newData.isString() && newData.val().length > 0"}

    最下層のRTDBのルールを上記にしているのですがsetValue(Array)をしても入りません。
    setValue("Apple")をすると入ることから入れる場所はあっていると思います。
    このルールはどのようにすればデータが入れられるようになるでしょうか。

    RTDBのご指摘勉強になります。ありがとうございます!

    キャンセル

  • 2018/10/16 00:36

    "$sample"でkey指定してその中に上記のルールを記載することでうまくいきました。

    gekijinさん丁寧な回答ありがとうございました!

    キャンセル

同じタグがついた質問を見る

  • Swift

    8727questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    4910questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • Firebase

    897questions

    Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。