あるSEのつぶやき・改

ITやシステム開発などの技術に関する話題を、取り上げたりしています。

React Native+Realmで、Androidで保存したデータが読み込めない不具合の対応

React Native + Realm で、Android に保存したデータベースのデータを読み込めないという不具合に遭遇しました。

React Native のプログラム(抜粋)は、以下のような感じです。

// Person テーブルを検索する
const people = realm.objects('Person').filtered('age > $0', 20);

console.log(JSON.stringify(people));

for (const p of people) {
  console.log(p.name);
}
people.forEach(person => {
  console.log(`name=${person.name}, age=${person.age}`);
});

このプロジェクトを実行すると、以下のようにデータが返ってこない(JSON)ので、undefined が出力されてしまいます。

f:id:fnyablog:20200321192452p:plain:w640

こんな基本的なところで不具合に遭遇するとは思ってなかったのでまいってしまいました。いろいろ試してみたけど、全然現象は解消されません。

もうダメかなと思いましたが、そういえば Realm のバージョンを変えてなかったと思い、試しに変えてみたらビンゴ!Realm のバージョンの問題でした。

問題のあるバージョンは Realm JavaScript の v5.0.1 でしたが、これを v3.6.5 にバージョンダウンすることで問題が解消されました。

Realm のバージョンを変更する方法は、まずpackage.jsonで以下のように編集します。

- "realm": "^5.0.1"
+ "realm": "^3.6.5"

そうしたら、以下のコマンドを順番に実行していきます。

$ rm -rf node_modules
$ yarn
$ cd ios
$ pod cache clean Realm
$ pod cache clean RealmSwift
$ pod deintegrate || rm -rf Pods
$ pod install --verbose
$ rm -rf ~/Library/Developer/Xcode/DerivedData

これで、以下のコマンドを実行すると、Android のエミュレータが起動して正しいログが出力されるようになります。

$ npx react-native run-android

f:id:fnyablog:20200321192956p:plain:w640

よもや、こんな基本的なところで引っかかるとは思ってなかったのでハマってしまいました。

ほぼ一日かかりましね。。

あと、React Native で Realm を使用する際は、node のバージョンに制限があるのでご注意ください。これもはまりどころですね。最初、node v12.4.0 を使っていました。最終的に、v10.x の最新版である v10.16.0 にしました。

Node version 8.3.0 (and later versions in 8.x) and 10.x are supported.

https://realm.io/docs/javascript/latest/#installation

複数バージョンの node を管理するために、nodenv を使用しました。

詳しくは下記記事を参考にしてください。

www.aruse.net