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

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

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

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

Cloud Firestore

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

1回答

558閲覧

Cloud Firestoreでのデータベース構築の工夫・応用

Kokeshi432

総合スコア15

Firebase

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

Cloud Firestore

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2020/01/28 17:47

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
現在、Androidアプリの開発に際し、Cloud Firestoreを用いたデータベースの構築をしていました。
そこで、以下のような問題に当たりました。
ご教授頂けますと幸いです。よろしくお願いします。

発生している問題

FirebaseのRealtime Databaseでは以下のようなコードで
・postsコレクション/postId/postValues
・user-postsコレクション/userId/postId/postValues
以上の2つ作っていました。

ここで後者のuser-postsコレクションには、
前者のpostに含まれる情報(userId)が共通するものでそれぞれドキュメントを作っていると理解しているのですが、
これをCloud Firestoreで実現するためのコードの書き方が全くわかりません。

ソースコード

RealtimeDatabaseのチュートリアル内のNewpostActivity.javaの一部分

java

1 String key = mDatabase.child("posts").push().getKey(); 2 Post post = new Post(userId, username, title, body); 3 Map<String, Object> postValues = post.toMap(); 4 5 Map<String, Object> childUpdates = new HashMap<>(); 6 childUpdates.put("/posts/" + key, postValues); 7 childUpdates.put("/user-posts/" + userId + "/" + key, postValues); 8 9 mDatabase.updateChildren(childUpdates);

試したこと

Firestoreでこの問題に当たり、Realtime Databaseのチュートリアルではうまくできていたので調べまくったのですが、私自身のFirestoreへの理解もまだまだなのでよくわかりませんでした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

貼っていただいたコードを見て、実現したいことは以下のようなことなのかな、と想像して回答しております。

  1. まずuserIdというものがすでにどこかで払い出されている
  2. postsコレクションにドキュメントを作成する

そのドキュメントの中の要素は、userId, username, title, body
3. 2で作成したドキュメントのID[postId](コード中ではkeyとしている値)を取得して、2で作ったドキュメントと同じものを、userpostsコレクションに作成する
イメージ説明

以下のような処理を組み合わせれば実現できそうかな、とおもいます。
詳細はこちら(Firestoreの公式ドキュメント)

■コレクションの中にドキュメントを作成する(ドキュメントIDを自動生成させる場合)

// Add a new document with a generated id. Map<String, Object> postData = new HashMap<>(); postData.put("userId", userId); postData.put("username", "なまえ"); db.collection("posts") .add(postData) // ドキュメントIDを自動生成させたい場合はadd .addOnSuccessListener(new OnSuccessListener<DocumentReference>() { @Override public void onSuccess(DocumentReference documentReference) { // 作成に成功したらこの関数が呼ばれます // このようにgetIdすると自動生成されたpostsのドキュメントIDが取得できます Log.d(TAG, "DocumentSnapshot written with ID: " + documentReference.getId()); } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.w(TAG, "Error adding document", e); } });

■コレクションの中にドキュメントを作成する(ドキュメントIDを指定する場合)

Map<String, Object> userpostData = new HashMap<>(); userpostData.put("userId", userId); userpostData.put("username", "なまえ"); db.collection("userposts") .document(userId) // ユーザーIDを指定 .collection("posts") .document(postId) // 取得したpostsのドキュメントIDを指定 .set(postData) // ドキュメントIDを指定したい場合はset .addOnSuccessListener(new OnSuccessListener<DocumentReference>() { @Override public void onSuccess(DocumentReference documentReference) { // 作成に成功したらこの関数が呼ばれます Log.d(TAG, "DocumentSnapshot written with ID: " + documentReference.getId()); } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.w(TAG, "Error adding document", e); } });

投稿2020/02/01 04:20

daisuken

総合スコア76

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

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

Kokeshi432

2020/02/07 08:14 編集

ありがとうございます! 大変参考にさせていただきました! 重ねて質問させていただきたいのですが、 Queryで単一ドキュメントを取得後からid取得までの操作がよくわからないのですが、 実際にpostsのドキュメントIDを取得するにはどうしたらいいのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問