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

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

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

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

Xcode

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

Swift

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

Q&A

解決済

1回答

893閲覧

Swift:Firebase Realtime Database に保存した"金額"のデータをフィルタリングして加算する方法

Y.Kame

総合スコア13

Firebase

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

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/08/19 20:00

前提・実現したいこと

Xcode/Swift5 で、Firebase(Realtaime Database)を利用して
プリペイドカードのようなシステムを作っています。

イメージ説明

上記のような構成で、それぞれの"number"毎にお金を チャージ/支払い した記録を取っています。

"number"でフィタリングした後に、すべての"price"を加算して
残高を計算するようなコード作りたいんですが、方法がわかりません。

ご教授いただければと思い、投稿させて頂きました。

(Swift勉強歴2週間)

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

"Action"の中の"number"を限定してフィルタリングすることはできたんですが、 "price"だけを抽出したり、更に加算したりする方法がわかりません。 // *中略* // let ref = Database.database().reference().child("Action").queryOrdered(byChild: "number").queryEqual(toValue: argString) ref.observeSingleEvent(of: .value, with: {(snapshot) in for item in snapshot.children { let snap = item as! DataSnapshot let dict = snap.value as! [String: Any] // データの中身 print(dict) } })

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

hameji

2019/08/19 23:50 編集

argStringには何が入るのですか??? そして、そのロジックで行くと、 100回取引がある場合の今月分だけ取り出したい場合も、 データ記録期間か不明ですが、 全てのデータを抽出しないと、 現在の残りがわからないとなってしまいますよ。 毎回膨大な負荷をかける設計であることをお伝えします。 あと、データベースがactionでまとめられていますが、 チャージなのか、支払いなのかのデータもなさそうに見えました。 銀行などの金融システムに詳しい訳ではありませんが、 1回1回残高なども記録されていると思いますよ。 コード・質問内容を見ると、あまり精通しているようには思えませんが、 どんなアプリかわかりませんが、 お金はセンシティブなデータなので、 シュミレーターなどの遊びのものじゃなければ 素人があまり手を出さない方が身のためだと思います。 自分は一昨日知りましたが、 「Osushi」というサービスの二の舞になりますよ。
Y.Kame

2019/08/21 07:41

質問ありがとうございます。 "argString"には、遷移元のTextFieldでユーザーが入力したシリアルナンバーが値渡しされている状態です。 様々なアドバイスありがとうございます。 支払いアクション時には"price"に"-"を付けるようにしています。 今回はじめてアプリを作成しているのですが、自分が作りたいアプリを作る過程として現状のようなアプリの開発を勉強しています。頂いたアドバイスから都度残高を計算する仕組みならコードで記述できそうなのでやってみようと思います。
guest

回答1

0

ベストアンサー

練習用ということであれば、、、

データベースのnumberは
シリアルナンバー(argStringに代入される)をさしていて、
一意のユーザーを表しているんですよね。
queryEqual(toValue: argString)と付いているので、
そもそもシリアルナンバーは1種類のものしか取得していないので、
queryOrdered(byChild: "number")で並び替える意味がなくないですか?
むしろ、日付で並び替えた方がよくないですか?
それを考慮すると、

Swift

1let ref = Database.database().reference().child("Action").queryOrdered(byChild: "time").queryEqual(toValue: argString)

とした方がいいと思います。
データの中身がdict(dictionaryの短縮?)に入っているので、
dictionaryと認識しているのなら、

Swift

1let eachPrice = dic["price"] as! Int

などとまず値を取り出して、その値を足し算していけばいいと思います。

調べてみると、下記にswiftにarrayの要素を合計する便利なreduceというのがあると書いてあるので、
上記のeachPriceをArrayにセットし、このreduceを行えば、合計値が出せると思います。
http://www.cl9.info/entry/2015/10/02/235528

投稿2019/08/21 13:46

hameji

総合スコア1380

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

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

Y.Kame

2019/08/21 13:59

回答ありがとうございます。 とっても参考になりました! Actionごとに残高を計算するコード記述にも成功しました!
hameji

2019/08/21 14:01

解決して何よりです。 道筋だけで「直接のコードなし」に解決となり、こちらも嬉しい限りです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問