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

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

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

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

Q&A

解決済

1回答

265閲覧

Swift Realtime Databaseからの読み込み

globalplus

総合スコア119

Firebase

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

0グッド

0クリップ

投稿2019/11/15 09:59

編集2019/11/18 19:09

Realtime Databaseに書き込んだデータ(緯度経度の数値)を読み取りたいです。
しかし以下のエラーで困っています。アドバイス頂きたいです。

ViewController

1import UIKit 2import MapKit 3import CoreLocation 4import Firebase 5 6class FirstViewController: UIViewController, CLLocationManagerDelegate { 7 8 @IBOutlet weak var mapView: MKMapView! 9 @IBOutlet weak var latitude: UILabel! 10 @IBOutlet weak var longitude: UILabel! 11 let user = Auth.auth().currentUser?.uid 12 let locationManager = CLLocationManager() 13 var ref: DatabaseReference! 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 ref = Database.database().reference() 18 locationManager.delegate = self as! CLLocationManagerDelegate 19 20 } 21 //データ書き込み 22 @IBAction func userLocation(_ sender: Any) 23 { 24 let refLatitude = ref.child("userLatitude") 25 refLatitude.setValue(latitude.text) 26 let refLongitude = ref.child("userLongitude") 27 refLongitude.setValue(longitude.text) 28 } 29 //データ読み込み 30 @IBAction func othersLocation(_ sender: Any) 31 { 32 ref.child("userLatitude").child(user!).observeSingleEvent(of: .value, with: { (snapshot) in 33 // Get user value 34 let value = snapshot.value as? NSDictionary 35 let otherUserLatitude = value?["userLatitude"] as? Double 36 //Argument passed to call that takes no argumentsのエラー 37 let userDouble = User(Double: otherUserLatitude) 38 }) 39 { (error) in 40 print(error.localizedDescription) 41 } 42 } 43}

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

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

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

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

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

guest

回答1

0

ベストアンサー

Swift

1let username = value?["userLatitude"] as? Double? // 最後の?がいらないと思います。

この行がおかしいと思います。どこを参考にしたのでしょうか?

公式ドキュメント

それに、命名の仕方にも疑問がつきます。
「ユーザーの緯度」を「ユーザー名」という名称で保持するんですか???

投稿2019/11/15 16:12

hameji

総合スコア1380

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

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

globalplus

2019/11/15 19:45

アドバイスありがとうございます。?は消しました。 usernameをuserLatitudeに変更しました。 let userLatitude = value?["userLatitude"] as? Double let user = User(username: userLatitude) の様に変更しましたが同様のエラーが出ています。 エラー内容を訳してもuserLatitudeが存在しない引数?と言う意味だと思うのですが userLatitudeは宣言してますし、よくわかりません。。 どうしたら良いですか?
hameji

2019/11/18 13:46 編集

よく分かりませんが、 自分のRealtime Databaseの中身は見てみましたか??? そもそも、userLatitudeがきちんと登録されていないなどないでしょうか? ブラウザーでRealtimeDatabaseの中身をみながら 操作してみて探ってみてください let user = User(username: userLatitude) あと、上記の行も意味不明ですが、、、
globalplus

2019/11/18 17:21

ご返信ありがとうございます。 userLatitudは登録してあります。 しっかりデータの書き込みができる事は確認済みです。(UIButtonを押すと登録、更新できる仕様です) let user = ~~~に関しては公式ドキュメントのデータ一回読み取りをそのまま参考にしました。。
hameji

2019/11/18 23:47 編集

どの行でエラーが出ているのですか? let user = User(username: userLatitude) この行なのではないですか??? そもそものUserというクラスの定義は自分で行ってないのですよね??? そして、公式ドキュメントではusername(String型)を引数としていますが、 globalplusさんはdouble型を引数としています。気づいていますか??? コピペすれば動くものではないですよ。 自作アプリを作成するにはまだまだ基本の理解が足りないと思います、、、 本などで勉強するのが体系立てていていいと多いますよ。
globalplus

2019/11/19 03:29

公式ドキュメントと自分の違い(usernameの件)については前回返信した時に気付きました 前回返信時にlet user = ~~~のところを自分なりに変更してあります(通知がいってないですか?) Double型を渡している事はわかっています(座標なので自分で選んだ次第です)すみません。 しかし同様のArgument passed to call that takes no argumentsのエラー出ている事で困っています。 let userDouble = ~~~の行はなぜ入れるのか正直わかりません。しかし入れないとFatal errorとしてnilが返ってきてしまい、エラーになります。 let userDouble =~~~ をなぜ入れないといけないのか教えていただけると解決に繋がるかもしれません、 よろしくお願いします。
hameji

2019/11/19 05:21

別にuserを設定しないといけない訳でもないと思いますが、、、 なので、let userDouble ... の行は必要ないと思います。 let otherUserLatitude = value?["userLatitude"] as? Double をprint(otherUserLatitude)で出力できれば、 目的(Realtime database)からの読み込みはできているということになります。 大事なのは何をしたいかです。 何を、どう保存して、どう取り出して、どう利用するか それらを考えた上で、データベースの構造を決める必要があります。 ちなみにUserが気になるようなら、以下のレファレンスを読んでみてください。 https://firebase.google.com/docs/reference/swift/firebaseauth/api/reference/Classes/User?hl=ja https://firebase.google.com/docs/reference/swift/firebaseauth/api/reference/Protocols/UserInfo.html?hl=ja
globalplus

2019/11/19 06:27

let userDouble の行は消しました。 しかし、ref.child("userLatitude").child(user!).observeSingleEvent(of: .value, with: { (snapshot) inに対してUnexpectedly found nil while unwrapping an Optional valueのエラーが出ています。これに関してはoptional型を勉強してみようと思います。とりあえず、Argument passed to call that takes no argumentsは消えたのでベストアンサーとさせていただきます。optional型でわからなかったらまた質問させていただくかもしれません。その時はまたお願いします。毎度丁寧な説明ありがとうございます。
hameji

2019/11/19 07:42 編集

データベースに保存するところでは let refLatitude = ref.child("userLatitude") refLatitude.setValue(latitude.text) となっていますが、取得するところでは ref.child("userLatitude").child(user!).observeSingleEvent(of: .value, with: { (snapshot) in といきなり、child(user!)を挟んでいるから そんなのないよとなりnilが帰ってくるのではないですか? ref.child("userLatitude").observeSingleEvent(of: .value, with: { (snapshot) in で取得できないですか?
globalplus

2019/11/20 05:34

child(user!)を消したら取得できました。userと言うノードの下にuserLatitudeがあると言う意味だったのですね。なんでchildが2つあるんだろうとは薄々思っていましたが見落としてました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問