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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Firebase

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

Swift

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

Q&A

解決済

3回答

699閲覧

swiftでfirebase RealTimeDatabaseからデータを取得したい。

samusara

総合スコア21

Firebase

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

Swift

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

0グッド

0クリップ

投稿2019/08/03 14:28

編集2019/08/20 23:47

事前にFirebase RealTimeDataBaseにアップロードしてあるデータ群から個別のデータを取得したい。

cocoaPodsでアプリにFirebaseのFrameWork等のインストールはできます。
エクセル上のデータをCSVファイルで出力したものをCSV→JSONファイルに変換し、firebase のrealtaime Databaseにアップロードしました。
イメージ説明
イメージ説明

このデータ群からuserの番号とツリーの名前が一致した時にデータの取得を許可したいです。

例えばアプリから名前と番号を入力する時、画像で言えば井田さんは自分の登録番号が「37」なので自分の名前「井田」と番号「37」を入力する。
それぞれtextFieldに入力した時、名前以外のデータを返すようにしたいのですが、うまく参考文献を探すことができずに行き詰まっています。

どなたか力を貸していただけないでしょうか?

Xcode 10.3
swift 5.0.1
macOS Mojave 10.14.5

追記
上記より学習を進め

import UIKit
import Firebase

class ViewController: UIViewController {

@IBOutlet weak var inputIdnumber: UITextField! @IBOutlet weak var displayNum: UILabel! @IBOutlet weak var displayPoint: UILabel! @IBOutlet weak var displayName: UILabel! @IBOutlet weak var displayPtNum: UILabel! @IBOutlet weak var displayPrize: UILabel! @IBOutlet weak var displayPrize2: UILabel! @IBOutlet weak var displayPrizenum: UILabel! @IBOutlet weak var displayPrize2num: UILabel! // インスタンス変数 var DBRef:DatabaseReference! override func viewDidLoad() { super.viewDidLoad() //インスタンスを作成 DBRef = Database.database().reference() Database.database().reference().child("user").child("37").observeSingleEvent(of: .value, with:{(snapshot) in if let data = snapshot.value as? [String:AnyObject]{ let name = data["name"] as? String let ptnow = data["ptnow"] as? String let ptnum = data["ptnum"] as? String let prize = data["prize"] as? String let prize2 = data["prize2"] as? String let prizenum = data["prizenum"] as? String let prize2num = data["prize2num"] as? String print(name!) print(ptnow!) self.displayPoint.text = ptnow self.displayName.text = name self.displayNum.text = ptnum self.displayPrize.text = prize self.displayPrize2.text = prize2 self.displayPrizenum.text = prizenum self.displayPrize2num.text = prize2num } }, withCancel: nil)

}
}
のようなコードを元に「37」番の井田さんのデータを取り出すことができました。
Database.database().reference().child("user").child("37").observeSingleEvent(of: .value, with:{(snapshot) in
これは参照したい場所を最初から指定しているので当然と言えば当然なのです。
それでchild("37")⇦の中をtextfieldで入力した数字にしたいのですがうまくいきません。

viewDidLoadの下に

let inputIdNumber = inputIdnumber.textと
そして
child("37")→child(inputIdNumber!)と書き換えてみました

シミュレータにかけると
signal SIGABRTエラーが出てしまいます。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

要は、検索と同じようなことをしたいんですよね?

ただ、RealtimeDatabase では、name の値で検索はできないので、もし name が一致するデータを取得したいのであれば、Firestore を使う必要があります。

投稿2019/08/18 15:42

s.m_1

総合スコア293

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

samusara

2019/08/19 06:41

ご回答ありがとうございます! おっしゃる通り検索して値を取得したかったのですが、Firestoreで試すべきなのですね。 やってみます。 ありがとうございました!
guest

0

聞かれていることがよくわかりませんが、「名前」、「番号」を入力したら、
prizenumの値(37番の人の場合、値は1000)などを取得したいということでしょうか???

firebaseのチュートリアルを読んでデータの取得の仕方を勉強されるといいと思います。
urlの指定の仕方さえ間違わなければ、割と簡単にできるのではないでしょうか?
その際にfirebaseのセキュリティの設定も忘れずに。

投稿2019/08/16 18:40

hameji

総合スコア1380

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

samusara

2019/08/19 06:43

ご回答ありがとうございます。 質問すら間違っていたみたいです。チュートリアルを何度も読んでやっています。 もっと学習して途中経過を載せてみたいと思います。
guest

0

自己解決

上手なやり方とは思えませんが、名前と認識番号を入れるViewを作りその値を
遷移先に渡して名前と番号の照合をし符号した場合のみ
データ表示をする仕組みを作りました。イメージ説明

import UIKit

class numberInputViewController: UIViewController {

@IBOutlet weak var nit: UITextField! @IBOutlet weak var namei: UITextField! override func viewDidLoad() { super.viewDidLoad() nit.keyboardType = UIKeyboardType.decimalPad } // ①セグエ実行前処理 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // ②Segueの識別子確認 if segue.identifier == "toView2" { // ③遷移先ViewCntrollerの取得 let nextView = segue.destination as! ViewController let next2View = segue.destination as! ViewController // ④値の設定 nextView.argString = nit.text! next2View.arg2String = namei.text! } }

}

上記で名前と識別番号を入力し、OKボタンを
押した時、名前を番号を遷移先に渡します。

// ①引数(文字列)
var argString = ""
var arg2String = ""
// インスタンス変数
var DBRef:DatabaseReference!

override func viewDidLoad() { super.viewDidLoad() //インスタンスを作成 DBRef = Database.database().reference() Database.database().reference().child("user").child(argString).observeSingleEvent(of: .value, with:{(snapshot) in if let data = snapshot.value as? [String:AnyObject]{ let name = data["name"] as? String let ptnow = data["ptnow"] as? String let ptnum = data["ptnum"] as? String let prize = data["prize"] as? String let prize2 = data["prize2"] as? String let prizenum = data["prizenum"] as? String let prize2num = data["prize2num"] as? String print(name!) print(ptnow!) //ここに名前が一致した時の分岐を作る if self.arg2String == name { self.displayPoint.text = ptnow self.displayName.text = name self.displayNum.text = ptnum self.displayPrize.text = prize self.displayPrize2.text = prize2 self.displayPrizenum.text = prizenum self.displayPrize2num.text = prize2num } }else{ self.displayworning.text = "warning" } }, withCancel: nil)

}
}

上記の様に
Database.database().reference().child("user").child(argString)
のargStringをユーザーが任意の数字を入れ、返ってきたnameと入力した名前(arg2String)が符号した時にデータを表示できる様になりました。

コーディングが下手なせいでViewを二つに分けることにして目標を達成できました。

次は名前と認識番号が「空」の時にOKボタンを押しても遷移せずに画面に止まり、入力を促す様にしてみたいと思います。

投稿2019/09/01 05:58

samusara

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問