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

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

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

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

データベース

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

Swift

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

Q&A

解決済

2回答

770閲覧

RealmとSwiftを使ったアプリケーション実装

sterengers

総合スコア5

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

データベース

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

Swift

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

0グッド

0クリップ

投稿2020/11/04 06:23

前提・実現したいこと

初心者です。
現在Realmを使ってデータベースを使って
ユーザ情報などの登録を目標としています。
ローカルでのシミュレーションは成功しています。
そこから先の工程が全く想像できません。

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

データベースなのでオンライン中でしか触れないと思うのですが
SQLはweb開発でlocalhostで使っていたのでphpを使って接続等はできましたが
今回実装にあたりローカルではダメだと思うのですがRealmが
MAMPの様に有料版があるのかそれともそもそも私の考えが違うのかわからず
今回質問しました。

###コード
ViewController.Swift

import UIKit
import RealmSwift

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var textFieldName: UITextField! @IBOutlet weak var textFieldtype: UITextField! @IBOutlet weak var textFieldGender: UITextField! @IBOutlet weak var textFieldhabit: UITextField! @IBOutlet weak var table: UITableView! // モデルクラスを利用し、取得データを格納する変数を作成 var tableCells: Results<Resident>! override func viewDidLoad() { super.viewDidLoad() print(Realm.Configuration.defaultConfiguration.fileURL) let realm = try! Realm() // データを全件取得する self.tableCells = realm.objects(Resident.self) print(realm.objects(Resident.self).count) } // 「登録」ボタンを押した際の処理 @IBAction func submitButton(_ sender: Any) { // モデルクラスのインスタンスを取得 let ResidentInstance:Resident = Resident() // テキスト入力値をインスタンスに代入 ResidentInstance.name = self.textFieldName.text ResidentInstance.type = self.textFieldtype.text ResidentInstance.gender = self.textFieldGender.text ResidentInstance.habit = self.textFieldhabit.text // Realmインスタンスを取得 let realm = try! Realm() // DB登録処理 try! realm.write { realm.add(ResidentInstance) } // テーブル再読み込み self.table.reloadData() } // cellの数を指定 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.tableCells.count } // cellに値を設定 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) let tmpCell: Resident = self.tableCells[(indexPath as NSIndexPath).row]; cell.textLabel?.text = tmpCell.name return cell }

}

Resident.swift

import RealmSwift
import Foundation

class Resident: Object {
@objc dynamic var name: String?
@objc dynamic var type: String?
@objc dynamic var gender: String?
@objc dynamic var habit: String?
}

試したこと

シミュレーションでは動いてます

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

Xcode12
Realm 10.0.0

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

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

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

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

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

guest

回答2

0

データベースなのでオンライン中でしか触れないと思うのですが

Realm はオフラインデータベースであり、ローカルにデータを保存するためネットワーク接続は必要としません。
ただし、オフラインでありアプリベースのローカルデータベースなので、異なるアプリや端末でその内容を共有することもできません。

一方、MongoDB Realm というのもあるようで、こちらはオンライン同期も可能となっているようです。
ただし、Offline first ということなので、必ずしも常にオンラインと同期しているわけでもなさそうです(ネットワーク接続がなければ、Google などが提供するオンラインベースも使えませんので、その点は同じですが、MongoDB Realm はローカルにもデータを保存できる点で異なるようです)。

どのようにすれば良いのかは、下記のリンクを読んでいただくのが一番良いかと思います。

投稿2020/11/04 09:07

TsukubaDepot

総合スコア5086

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

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

sterengers

2020/11/04 13:45

細かい返信ありがとうございます!!! 理解がとても深まりました オフラインファーストなのを知らなかったです オンラインファーストで位置情報を取得してその動作を起こすアプリを作る場合(本来これを作成したいです)何を使うのが一番いいでしょうか? 質問ばかりですいません。
TsukubaDepot

2020/11/04 15:15

具体的にどのようなアプリを想定されているのでしょうか。 もう少し具体的な仕様をおしえていただければご助言可能かもしれません。
sterengers

2020/11/04 16:59

登録したユーザを周囲5km県内の気になる学生を表示させてチャットさせるアプリです。 位置情報とユーザ情報などをDBに入れて保存しておきたいです
TsukubaDepot

2020/11/05 02:52

基本的なアプローチとしては 1)参加者は定期的にサーバに対して自己位置をアップロードする 2)同時に、参加者は他者の位置情報を定期的にチェックし、それが特定の範囲内に入っているかチェックする という流れになるかと思います。 2)については一般的にはユーザから取得(フェッチ)することになりますが、更新情報をサーバからプッシュする方法もありますので、そのような仕組みが備わったオンラインデータベースを使うのがよいのではないで しょうか。 位置情報だけを保存するのであれば、基本的には特定・不特定多数からアクセス可能なデータベースを用意すれば良いので、その目的を達成できるデータベースのうち、ご自身が使いやすいと思ったのもを使えばいいかと思います。 Firestore 系はほとんど触っていないので詳しいことはわかりませんが、データの更新があった場合にサーバ側から通知が来る仕組み(イベントリスナー)がありますし、位置情報として登録することによって特定の近接があればそれを検知する仕組みもあるようです(ただし、新しい情報はなく、見つけた情報も2年前で現時点で実装されているかはわかりません。ぜひご自身で調べていただければと思います)。 国内だとニフティ(ニフクラ、Nifty Cloud Mobile Database, NCMB)があり、こちらは近接情報をサーバとしてサポートしています。SDK(フレームワーク)も提供してあり、Swiftでも使えるようですが、ドキュメントがObjective-C 向けしか実質存在しないため、少し読み解く必要がありそうです。 その一方、ニフクラだとサーバからの Notification を受信できる仕組み(もちろん、任意のタイミングで送信もできる)上、日本のシステムなので信頼できるドキュメントやニフクラ主宰の掲示板があるという強みはあると思います。 ただ、いずれにしても気をつけないといけないのは、位置情報の更新頻度です。 もし、1秒に一回位置情報をアップロードすれば、1日つかうだけで84,000アクセス(アップロードだけで)、仮に五人で使うと40万アクセスを超えるため、あっという間に無料枠を超えてしまうと思います。 どの程度の更新頻度にするのか、また近接情報をプッシュで得るにはどのデータベースが良いのかについては、かなり研究の余地がありそうです。 逆に言えば、チャレンジしがいのあるテーマだとおもいすので、ぜひ実現していただければと思います。
sterengers

2020/11/08 02:18

ありがとうございます!!!! 新しく学ぶことがとても多い内容と感じましたが頑張ります
guest

0

自己解決

基本的なアプローチとしては
1)参加者は定期的にサーバに対して自己位置をアップロードする
2)同時に、参加者は他者の位置情報を定期的にチェックし、それが特定の範囲内に入っているかチェックする
という流れになるかと思います。

2)については一般的にはユーザから取得(フェッチ)することになりますが、更新情報をサーバからプッシュする方法もありますので、そのような仕組みが備わったオンラインデータベースを使うのがよいのではないで

しょうか。

位置情報だけを保存するのであれば、基本的には特定・不特定多数からアクセス可能なデータベースを用意すれば良いので、その目的を達成できるデータベースのうち、ご自身が使いやすいと思ったのもを使えばいいかと思います。

投稿2020/11/08 02:19

sterengers

総合スコア5

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問