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

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回答

2574閲覧

Realmでデータベースから値を取ろうとするとエラーになる

tarofess

総合スコア127

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クリップ

投稿2016/10/01 00:06

編集2016/10/01 01:10

現在Realmを使って下記のようにデータベースから値を取得しようとしているのですが、エラーが出て取得できません。

Swift

1let realm = try! Realm() 2let predicate = NSPredicate(format: "name = %@", name) 3let users = realm.objects(User.self).filter(predicate)

エラーは「EXC_BAD_ACCESS」で、下記のコードのreturn文に表示されています。

Swift

1public func objects<T: Object>(_ type: T.Type) -> Results<T> { 2 return Results<T>(RLMGetObjects(rlmRealm, (type as Object.Type).className(), nil)) 3}

ちなみにモデルクラスは以下のようになっています。

Swift

1class User: Object { 2 3 dynamic var id = UUID().uuidString 4 dynamic var name: String! 5 dynamic var score = 0 6 dynamic var characterName = "赤ちゃん" 7 8 override class func primaryKey() -> String { 9 return "id" 10 } 11 12}

なぜ値を取得できないのでしょうか?
個人的にはバージョンに何か問題があるような気がしているのですが......。
Swiftのバージョンは3.0で、Realmのバージョンは2.0.0です。
どなたかわかる方がいれば教えていただきたいです。よろしくお願いします。

///追記///

エラーに関わる範囲のコードを追記しました。

Swift

1 // MARK: - IBAction 2 3 @IBAction func addNewUser(_ sender: AnyObject) { 4 self.showAddNewUserAlert() 5 } 6 7 // MARK: - alertController 8 9 func showAddNewUserAlert() { 10 let alert:UIAlertController = UIAlertController(title:"登録", message: "名前を入力してね", preferredStyle: UIAlertControllerStyle.alert) 11 okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler:{ (action:UIAlertAction!) -> Void in 12 let textField = alert.textFields![0] 13 14 if self.checkHasSameUserNameInDatabase(textField.text!) { //エラーが出るメソッド 15 let user = User() 16 user.name = textField.text! 17 UserManager.sharedManager.insertUser(user) 18 UserManager.sharedManager.users.append(user) 19 20 let indexPath = IndexPath(row: UserManager.sharedManager.users.count - 1, section: 0) 21 self.tableView.insertRows(at: [indexPath], with: UITableViewRowAnimation.automatic) 22 } else { 23 self.showFailureAlert() 24 } 25 }) 26 27 let cancelAction:UIAlertAction = UIAlertAction(title: "キャンセル", 28 style: UIAlertActionStyle.cancel, handler:{ 29 (action:UIAlertAction!) -> Void in 30 }) 31 okAction.isEnabled = false 32 alert.addAction(cancelAction) 33 alert.addAction(okAction) 34 35 alert.addTextField(configurationHandler: {(text:UITextField!) -> Void in 36 text.placeholder = "名前" 37 text.delegate = self 38 }) 39 present(alert, animated: true, completion: nil) 40 } 41 42 func checkHasSameUserNameInDatabase(_ name: String!) -> Bool { 43 let realm = try! Realm() 44 let predicate = NSPredicate(format: "name = %@", name) 45 let users = realm.objects(User.self).filter(predicate) //ここでエラーが出る 46 47 if users.count == 0 { 48 return false 49 } else { 50 return true 51 } 52 } 53

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

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

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

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

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

guest

回答2

0

ベストアンサー

Realmの問題なのかSwiftの問題なのかわかりませんが、プロジェクト名に漢字やカタカナが含まれていることが問題のようです。

イメージ説明

上のスクリーンショットのようにXcodeの機能でプロジェクト名をリネームできますので(関連して必要な変更を自動的にしてくれる)、プロジェクト名をアルファベットのみにするなど変更して使ってください。

Realmの問題かどうかはこれから深く調査します。教えていただいてありがとうございました。

投稿2016/10/03 23:35

編集2016/10/03 23:36
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tarofess

2016/10/04 12:19

ご回答ありがとうございます。プロジェクト名の表記が関係していたのですね。では一旦プロジェクト名をリネームしようと思います。ありがとうございました。
guest

0

表示されたエラーメッセージでググれば解決策が見つかるかも?

投稿2016/10/01 00:35

Orlofsky

総合スコア16415

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

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

tarofess

2016/10/01 00:45

エラーメッセージ等でググってはいるのですが、解決策は見つかりませんでした...。
Orlofsky

2016/10/01 00:49

他の質問を見てわかり易い書き方を学びましょう。 そのエラーメッセージを差支えない限り、編集しないでそのまま載せてみては?
tarofess

2016/10/01 00:52

エラーメッセージをそのまま載せても「Thread 1:EXC_BAD_ACCESS (code=1, address=0x10)」しかありません。なぜこれがreturn文のところで出ているのでしょうか?
Orlofsky

2016/10/01 00:57

http://www.zero4racer.com/blog/88 >EXC_BAD_ACCESSというエラーは、あるメモリにアクセスしようとしたが、そのメモリ領域にあったデータは既に解放されていて、何も見つかりませんでしたという、致命的なエラーです。... わたしは動作確認できる環境を持っていません。差支えない範囲で現象を再現できるだけのコードを提示すれば解決への糸口が見つかるかも?
tarofess

2016/10/01 01:04

なるほど、なのでBAD_ACCESSということなのですね。了解しました。コードを載せたいと思いますので少々お待ちください。
tarofess

2016/10/01 01:10

コードを追記しました。
Orlofsky

2016/10/01 01:50

このコメントを読んでいる人は少ないのでエラーメッセージも含めて > let predicate = NSPredicate(format: "name = %@", name) > let users = realm.objects(User.self).filter(predicate) //ここでエラーが出る 辺りの内容の Playground の中身も質問に載せては?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問