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

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

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

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

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

解決済

1回答

435閲覧

Firestoreでの深い位置にある情報の取得方法

KeiHarry

総合スコア10

Firebase

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

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

0グッド

0クリップ

投稿2022/08/13 08:49

前提

Firestoreの深い位置にある情報を取得したいです。というのも、

コレクションA-----ドキュメントB0---------コレクションC0----ドキュメントD0 |-フィールドb0 | | |-フィールドd0 |-フィールドb1 | | |-フィールドd1 |-フィールドb2 | | | |-ドキュメントD1 | |-コレクションC1---ドキュメントE0 | |-フィールドe0 | |-フィールドe1 | |-ドキュメントE1

という構造でデータを格納していて、

dart

1Expanded( 2 child: StreamBuilder<QuerySnapshot>( 3 // 投稿メッセージ一覧を取得(非同期処理) 4 // 投稿日時でソート 5 stream: FirebaseFirestore.instance 6 .collection('books') 7 .doc(widget.bookInfo.id) 8 .collection(widget.bookInfo['name']) 9 .orderBy('date') 10 .snapshots(), 11 builder: (context, snapshot) { 12 // データが取得できた場合 13 if (snapshot.hasData) { 14 final List<DocumentSnapshot> documents = snapshot.data!.docs; 15 : 16 :

上のstreamの記述はこれで正しく、データの構造におけるドキュメントDの層をフィールドのdate順に表示することを示せているのですが、最後のdocuments=の部分で、この状態ではドキュメントBの層について格納していることになります。

dart

1print(documents[0]['name']);

とすると、ドキュメントBの中のフィールドb層のnameの中身が出力される状態です。

実現したいこと

・ドキュメントD層の中のフィールドd層の中身を出力したいです。
つまり、

dart

1print(documents[index]['name']);

でドキュメントD層をindexで指定し、それが持つフィールドdの内、nameの中身を出力できるように、1番最後の

dart

1final List<DocumentSnapshot> documents = snapshot.???????;

を書き換えたいです。

発生している問題・エラーメッセージ

設計段階のためエラーは出ていません。

該当のソースコード

試したこと

dart

1final List<DocumentSnapshot> documents = snapshot.data!.docs;

のsnapshotより後ろのdata!以下をいじったり、snapshotとdata!の間に文字を挟もうとしましたがダメでした。

補足情報(FW/ツールのバージョンなど)

pubspec.yaml

1name: XXXX 2description: A new Flutter project. 3 4publish_to: 'none' 5 6environment: 7 sdk: ">=2.17.6 <3.0.0" 8 9dependencies: 10 flutter: 11 sdk: flutter 12 cupertino_icons: ^1.0.2 13 firebase_core: ^1.17.1 14 firebase_crashlytics: ^2.8.1 15 firebase_analytics: ^9.1.8 16 flutter_inappwebview: ^5.3.2 17 firebase_auth: ^3.3.8 18 cloud_firestore: ^3.4.3 19 provider: ^5.0.0 20 flutter_riverpod: ^1.0.4 21 get: ^4.6.5 22 hive: ^2.2.3 23 hive_flutter: ^1.1.0 24 hive_generator: ^1.1.3 25 build_runner: ^2.2.0 26 flutter_slidable: ^2.0.0 27 sqflite: ^2.0.3 28 29dev_dependencies: 30 flutter_test: 31 sdk: flutter 32 flutter_lints: ^2.0.0 33 34flutter: 35 uses-material-design: true

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

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

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

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

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

TakaseHiromichi

2022/08/14 01:01

documents 自体にはどのような値が入っているのでしょうか?
KeiHarry

2022/08/14 13:08

ありがとうございます。 https://www.flutter-study.dev/firebase-app/firestore こちらの教材を写経してそれを改造する形で製作しているため、"snapshot."がどういうものか分かっていないのですが、1番上の図で言うところのコレクションAとドキュメントBの間で切ってそれ以下の情報を ```dart final List<DocumentSnapshot> documents = snapshot.data!.docs; ``` で入れて、 ```dart print(documents[0]['name']); ``` のように出力します。
TakaseHiromichi

2022/08/15 00:51

はい、documents 自体をprintするとどのような値が表示されるのかが気になります。
TakaseHiromichi

2022/08/15 00:53

documentsでDを引っ張ってこれているのですよね?
TakaseHiromichi

2022/08/15 00:54

> ドキュメントDの層をフィールドのdate順に表示することを示せている というのは、どちらから判断されましたか?実際にデータを表示できていることを確認しましたか?
KeiHarry

2022/08/15 07:58

ありがとうございます。 documentsをprintすると >[Instance of '_JsonQueryDocumentSnapshot', Instance of '_JsonQueryDocumentSnapshot'] と出力されました。 documentsではDは引っ張ってこれておらず、 >documents[0]['name'] でB層の0番目のドキュメント(つまりB0)の中のnameというフィールドの中身を得られます。 >stream: FirebaseFirestore.instance .collection('books')//A層 .doc(widget.bookInfo.id)//B層 .collection(widget.bookInfo['name'])//C層 .orderBy('date') .snapshots(), でドキュメントD層をフィールドのdate順に並べていると判断したのは、ここでいう3,4行目は独自に追加したもので、参考にした教材通りに >>stream: FirebaseFirestore.instance .collection('books')//A層 .orderBy('date') .snapshots(), とすると、ドキュメントB層をフィールドのdate順に並べられたからです。booksというのはコレクションAの名前です。ここにエラーが出ていないことから、並べられていると判断しました。 firestoreの中身についての処理は >stream: FirebaseFirestore.instance .collection('books')//A層 .doc(widget.bookInfo.id)//B層 .collection(widget.bookInfo['name'])//C層 .orderBy('date') .snapshots(), builder: (context, snapshot) { // データが取得できた場合 if (snapshot.hasData) { final List<DocumentSnapshot> documents = snapshot.data!.docs; この部分だけであると考えられ、streamで指定した層に応じてbuilderのsnapshot.data!.docsが変わるのだと思いましたが、documentsに入っていたのはB層以下の情報でした。 .......とここまで打ってもう一度確認したところ自分のミスに気づきました。すみません、自己解決できました。ありがとうございます。
guest

回答1

0

自己解決

streamの部分で正しく指定するとbuildの中でsnapshot.data!docsでデータを取得できます。その後存在しないフィールドを指定するとエラーが出ます。また各層のフィールドの名前が同じだとどの層の設計をしているのか分からなくなります(情けないことに自分はこれで勘違いを引き起こし2週間止まってました😭)。

投稿2022/08/15 08:01

KeiHarry

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問