ReactNativeのデータベースとしてRealm, RealmBrowserを使う

軽量・高速モバイルデータベースRealm入門 | 菅原 祐, Realm 岸川 克己 |本 | 通販 | Amazon

ReactNativeが叩くデータベースとして、以下の3つを考えていました。

  • AsyncStorage
  • sqlite
  • Realm

AsyncStorageは、直接叩くのは、軽い機能の場合以外はやめたほうが良いと公式ドキュメントに書いてあります。なのでパス。

https://facebook.github.io/react-native/docs/asyncstorage.html

It is recommended that you use an abstraction on top of AsyncStorage instead of AsyncStorage directly for anything more than light usage since it operates globally.

sqliteとRealmのどちらにしようか迷って、とりあえずsqliteを試してみようかと思ってインストール手順を見たら、Xcode周りを多少いじる必要があるみたいで、面倒臭いのでやめました。OneSignalのSDKを使うときにもXcodeの設定変更が必要だったのですが、一部のソースコードの書き換え方を間違えてうまく動かず、そこそこ時間を取られてあまり良い印象がありません。Realmの方はpackage.jsonに書いておけば良さそうだったので、とりあえずRealmを使ってみることに。そんなにヘビーに使い倒すわけでもないので、詳細な比較検討はスキップしてしまいました。最低限、sqliteとRealmの両方ともiOS・Androidに対応していることだけは確認しました。

Realm
https://realm.io/jp/

$ npm install realm –save

の後にwriteのサンプルを書いて動かしてみたところサクッと成功。で、データベースの中身を見たくてググったところ、RealmBrowserなるものを発見しました。公式に提供されているGUIビューワとのこと。AppleのApp Storeで公開されているので早速インストールして起動します。

Realm browser (App Store)
https://itunes.apple.com/jp/app/realm-browser/id1007457278?mt=12

が、どのデータベースファイルを見るのか指定する必要があり、エミュレータがRealmのデータベースファイルをどこに保存しているのかわかりません。これは、以下をコンソール出力することでわかりました。

console.log(realm.path)

実際のファイルパスはこんな感じ。

/Users/xxx/Library/Developer/CoreSimulator/Devices/xxx/data/Containers/Data/Application/xxx/Documents/default.realm

RealmBrowserで開いてみたところ、以下のメッセージのダイアログが表示されました。

‘default.realm’ is at an older file format version and must be upgraded before it can be opened. Would you like to proceed?

ダイアログには”Proceed with Upgrade”と”Cancel”のボタンが付いており、Upgradeをやってみたら、iOS Simulatorで開けなくなりました。。。ということは、ReactNativeで使っているRealmとRealmBrowserのバージョンが一致していないことが原因だろうと予測。Realmのインストールでは勝手に最新版がインストールされるだろうから、RealmBrowserの古いバージョンを探して試して見たところ、ダイアログが表示されず無事に見ることができました。

Realm Browser 2.0.0
https://github.com/realm/realm-browser-osx/releases
package.json : “realm”: “^1.2.0”

あとは、シミュレータでアプリを起動しているときには排他制御がかかってRealmBrowserで読めないという問題がまだ解決できず残っているのですが、まぁ開発に大きな影響はありません。アプリと同時起動できたほうが便利なことは確かなので、解決方法がないか折を見て探して見るつもりです。