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

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

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

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

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

AppleWatch

AppleWatchは、iPhoneと連動して動作する時計型のデバイスです。時間の確認だけでなく、通話や受信メールの確認などを行うことができます。

解決済

Realmを使ったデータの送受信が出来ない

lahlah
lahlah

総合スコア16

Realm

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

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

AppleWatch

AppleWatchは、iPhoneと連動して動作する時計型のデバイスです。時間の確認だけでなく、通話や受信メールの確認などを行うことができます。

2回答

0リアクション

0クリップ

1774閲覧

投稿2019/11/25 09:47

編集2019/11/26 06:02

前提・実現したいこと

iPhoneの Realmデータを Apple Watchに送るプログラムを考えています.
各デバイスにアプリをインストールすることは出来ましたが、データの送受信が上手く行きません.

何が不足しているのでしょうか?
ご回答よろしくお願いします.

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

watchOSのプログラムを実行した時に以下のエラーメッセージが出ます.

Terminating app due to uncaught exception 'RLMException', reason: 'Realm accessed from incorrect thread.'

追記 11/26
watchOS プログラムの
let realm = try! Realm()
をrealmデータを取得する関数の中に持って行ったところ、上記のエラーは解消されましたが、代わりに以下のエラーが発生します.

Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=2 "Unable to open a realm at path '/var/mobile/Containers/Data/PluginKitPlugin/E7F03F8B-86D4-42AF-AC8A-A1F2B2E27780/Documents/Inbox/com.apple.watchconnectivity/AFBC4FDB-28C3-4D55-A833-1E5F59DA0C4B/Files/F39F9FCD-AA0E-48B8-897D-E67AF8D2D043/default.realm.management': make_dir() failed: Operation not permitted Path:Exception backtrace:

該当のソースコード

iOSのプログラム

swift

import UIKit import RealmSwift import WatchConnectivity class ViewController: UIViewController, WCSessionDelegate { let realm = try! Realm() let get = cData() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. get.name = "abc" get.memo = "def" try! realm.write { realm.add(get) } print("for iPhone") print(get.name) print(get.memo) //データの追加 try! realm.write { get.name = get.name + "ghi" } if WCSession.isSupported() { let session = WCSession.default session.delegate = self session.activate() } } //ボタン押したらデータ送信 @IBAction func sending(_ sender: UIButton) { //realmデータを送る if let path = Realm.Configuration().fileURL { WCSession.default.transferFile(path, metadata: nil) print("send data to Apple Watch") } } @available(iOS 13.1, *) func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { print("activation did complete!\n") } func sessionDidBecomeInactive(_ session: WCSession) { print("session did become inactive") } func sessionDidDeactivate(_ session: WCSession) { print("session did deactivate") } }

watchOSのプログラム

swift

import WatchKit import Foundation import RealmSwift import WatchConnectivity class InterfaceController: WKInterfaceController, WCSessionDelegate { override func awake(withContext context: Any?) { super.awake(withContext: context) // Configure interface objects here. if WCSession.isSupported() { let session = WCSession.default session.delegate = self session.activate() } } @available(watchOS 6.0, *) func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { print("watch activation did completed") } //realmデータを取得する関数 func session(_ session: WCSession, didReceive file: WCSessionFile) { var config = Realm.Configuration() config.fileURL = file.fileURL Realm.Configuration.defaultConfiguration = config let realm = try! Realm() let text = realm.objects(cData.self) print("memo: (text[0].memo)") print("name: (text[0].name)") } override func willActivate() { // This method is called when watch view controller is about to be visible to user super.willActivate() } override func didDeactivate() { // This method is called when watch view controller is no longer visible super.didDeactivate() } }

試したこと

同様の事例がないか調べましたが、似た事例はあるものの今回のエラーの解決につながるようなものが未だ見つかりません.

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

バージョン
Xcode 11.1, Swift5.0.1
iPhoneX, Apple Watch Series4

・let realm = try! Realm()
をrealmデータを取得する関数内に書くようにしたところ、iOSのプログラムを実行すればボタンを押した時にコンソールに "send data to Apple Watch" は出力されるようになりました.

・watchOSのプログラムを実行した時は、"watch activation did completed" がコンソールに出力された後、エラーメッセージが表示されます.

・WatchConnectivityの使い方を知るために、Apple公式サイトを参考にしましたが、このサイトの Get Started の手順5.6がいまいちよく分からなかったため、正しい手順を踏めていないことが今回のエラーにつながっているのかもしれません.

手順5については、プロジェクトにSettings-Watch.bundleを追加し、Root.plistのApplicationGroupContainerIdentifierをApp groupsで作成したグループ名にしました.
手順6については、TestDataProvider classがどこにあるのか分からなかったため、何もしませんでした.

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Realm

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

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

AppleWatch

AppleWatchは、iPhoneと連動して動作する時計型のデバイスです。時間の確認だけでなく、通話や受信メールの確認などを行うことができます。