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

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

ただいまの
回答率

88.03%

日記アプリ、Core Dataを使うべきか、Realmを使うべきか

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,245

score 82

自分は日記のようなiosアプリを作ろうとしている初心者です。

そこでデータベースを実装する必要があるので選択肢を調べて見たところ、CoreDataとRealmが候補にあがりました。

現状では、とりあえずRealmを使ってみようと思ったのですが、エラーが出てうまく使えません。
仕方ないので、CoreDataにしようかと調べてみたところ、使い方が難しいとか、とっつきづらいとの情報がありました。また、Realmのほうが簡単で、スピードも速いとの文言も目にし、どちらを勉強していくべきか迷っています。

そんな自分にIOSアプリのデータベースの使い分けについて、アドバイスをお願いします。
__________________________________________
Realmのエラーについて

BOOK.Swift
import Foundation

import Realm

class Book : RLMObject{
    dynamic var isbn = ""
    dynamic var name = ""
    dynamic var price = 0
    
    
    
}



ViewController.swift
 override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        saveData()
        
 
        

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func saveData(){
    
    let realm = RLMRealm.defaultRealm()
    
    let book = Book()
    book.name = "本の本"
    
    realm.beginWriteTransaction()
    realm.addObject(book)
    realm.commitWriteTransaction()
    
    for realmBook in Book.allObjects(){
    println("book isbn:\((realmBook as! Book).name)")
    println(RLMRealm.defaultRealmPath())
    println(realm.path)
    
    }
    }


}

上記のようにやってみたところ、何回かはうまくいったのですが、何回目からか、Threed1EXC_Bad_Accessと出て落ちるようになってしまいました。

なにかわかることがありましたら、アドバイスをお願いします。


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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Stripe

    2015/08/02 11:57

    Realmを使っていてエラーが出た、ということなら、まずはそのエラーについて質問するべきでは?もしも、今度はCoreDataを使ってエラーが出たらどうするつもりですか?

    キャンセル

回答 2

checkベストアンサー

+4

あまり詳しくないのでご参考程度に。

結論から先に書くと、自分なら Realm を使用します。が、必ずしもオススメしている訳ではありません。

まず、DBの選択肢という観点で考えると、CoreData 自体はDBではなく CocoaFrameworkに搭載されている O/Rマッパー なので、DB自体としての比較なら SQLite vs. Realm ということになると思います。

DBに限らず、複数の選択肢がある場合、何を優先するかで結果が違ってきますが、たとえば以下のような観点で検討することになると思います。
①速度
②(トランザクション等の)使いやすさ
③安定性(バグ、仕様変更など)
④情報の入手性(実装例やTipsなど)

①②については、当然、後発(Realm)の方が有利になりますし、逆に③④については先発(SQLite)の方が有利になります。

大規模なアプリを開発するのであれば慎重に選択する必要があると思いますが、(初心者とのことでしたので)アプリを実際に作成しながら学習し、いずれサービスを公開するというようなアプローチならば、率直に言ってどちらを選んでも構わないと思います。
その上で、情報の入手性 を優先させたければ SQLite先進性 のあるものにチャレンジしたければ Realm を選択すれば良いのではないでしょうか?
(自分の場合は、たまたま後者だっただけ)

確かに、Realm については 高速性 が話題になっていて下記のような情報もあります(ただし Android の例です)が
RealmとSQLiteを速度比較してみました
テスト用アプリの実装方法がそれぞれのDBに合っていたか?も関係してくるので、その数値を自分のアプリにそのまま単純に当てはめて考えることはできません。あくまでも参考レベルです。

また、自分が作成しようとしているアプリでは、本当にそれ程の速度が必要なのか?も見落としがちな観点です。
SQLite だって、軽量で結構速いです。
パフォーマンス比較 Cassandra、Mongodb、SQLite、H2、MySQL、Postgres

一方、情報の入手性については、ネットでざっと検索してみた限りでは、まだ Realm を使ってみました のような記事が多くヒットする段階ですし、開発が盛んということは仕様の変更が多くて入手した情報がすぐに陳腐化してしまうという問題もあります。
なので、一次情報源から最新の情報を自力で取得できるかどうかが重要になってきます。
幸い、日本語でも良い情報源がありますのでご参考になさってください。
Realm Swift 0.93.1

#バージョンがまだ1未満だということは、まだまだ仕様変更がありそうということを示唆しています。。

O/Rマッパー CoreData の使い勝手についても、同様の観点で別途検討する必要があると思います。

それで、事前に「決定」しようと思うと結構大変だと思いますが、世間の評判を気にし過ぎず、現時点でより「興味」の湧く方を(こうした質問サイトで質問しながらでも良いので)まずは使ってみたら良いと思います。
最低限、ある程度動くレベルまで作りこんで見て、実装上あまり上手く行かない部分が見つかったら、改めて「選択」し直すというアプローチもあるかと思います。
実装上、一番問題になるのは ②使いやすさ の部分ですが、これってある程度、実際に使い込んでみないと分からないので。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/02 12:09

    すごく丁寧に回答していただきありがとうございます。
    アドバイスを受けて、とりあえずRealmで実装を頑張ってみて、行き詰まったら違う方法を検討するという形で進めていこうと思います。
    いろいろと質問させていただきたいので、また回答していただければと思います。よろしくお願いします。

    キャンセル

0

CoreDataとRealmの使い分けのポイントとしてAndroidに移植する可能性があるかどうかという点もあります。
RealmはAndroidでも使えるのでAndroid版を将来考えているならRealmを使うのが良いと思います:-)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/03 19:28

    将来的にアンドロイド版も考えているので、やはりRealmを使いたいと思います。
    とても参考になりました。ありがとうございます。

    キャンセル

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

  • ただいまの回答率 88.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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