You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native笔记应用导入Realm后强制崩溃求助

React Native Realm导入时应用崩溃问题排查与解决

React Native新手开发笔记应用时,在AddNoteScreen.js中导入realm实例后应用直接强制退出,无明显报错。已尝试更换Realm版本(11.3.1 → 11.0.0-rc.1/rc.2),问题依旧。


相关代码与环境信息

1. 核心文件代码

AddNoteScreen.js

import { StyleSheet, Text, View, TouchableOpacity, TextInput, } from 'react-native';
import React, {useState} from 'react';
import {Icon} from 'react-native-elements';
import realm from '../../store/realm';

const saveNote = newNote => {
  const allData = realm.objects('Note');
  const dataLength = allData.length;
  let lastIdFromRealm = 0;
  if (dataLength !== 0) {
    lastIdFromRealm = allData[dataLength - 1].id;
  }
  if (newNote !== '') {
    realm.write(() => {
      realm.create('Note', {
        id: dataLength === 0 ? 1 : lastIdFromRealm + 1,
        note: newNote,
        date: new Date().toISOString(),
      });
    });
    alert('Successfully save your note!');
    const data = realm.objects('Note');
    console.log(data);
  } else {
    alert('Empty note!');
  }
};

const AddNoteScreen = props => {
  const [tempNote, setTempNote] = useState('');

  const {navigation} = props;
  return (
    <View style={styles.mainContainer}>
      <View style={styles.headerContainer}>
        <Text style={styles.title}>Create</Text>
        <TouchableOpacity style={styles.button}>
          <Icon
            name="check"
            type="font-awesome-5"
            size={18}
            onPress={() => saveNote(tempNote)}
          />
        </TouchableOpacity>
      </View>
      <Text style={styles.date}>Date</Text>
      <TextInput
        multiline
        placeholder="Write here"
        style={styles.input}
        onChangeText={text => setTempNote(text)}
      />
    </View>
  );
};

export default AddNoteScreen;

store/realm/index.js

import Realm from 'realm';
import {NoteSchema} from './NoteSchema';
const realm = new Realm({
  schema: [NoteSchema],
});
export default realm;

store/realm/NoteSchema.js

export const NoteSchema = {
  name: 'Note',
  properties: {
    id: 'int',
    note: 'string',
    date: 'string',
  },
  primaryKey: 'id',
};

2. 项目依赖

"dependencies": {
  "@react-native-community/masked-view": "^0.1.11",
  "@react-navigation/native": "^6.1.2",
  "@react-navigation/stack": "^6.3.11",
  "react": "^18.2.0",
  "react-native": "0.71.0",
  "react-native-elements": "^3.4.3",
  "react-native-gesture-handler": "^2.9.0",
  "react-native-reanimated": "^2.14.1",
  "react-native-safe-area-context": "^4.4.1",
  "react-native-screens": "^3.18.2",
  "react-native-vector-icons": "^9.2.0",
  "realm": "^11.3.1"
},

排查与解决步骤

1. 调整Realm初始化时机

当前同步初始化Realm可能因原生模块未就绪导致崩溃,改为异步初始化:
修改store/realm/index.js:

import Realm from 'realm';
import {NoteSchema} from './NoteSchema';

let realmInstance;

export const getRealm = async () => {
  if (!realmInstance) {
    realmInstance = await Realm.open({
      schema: [NoteSchema],
    });
  }
  return realmInstance;
};

修改AddNoteScreen.js的导入与使用:

// 替换原导入语句
import { getRealm } from '../../store/realm';

// 将saveNote改为异步函数
const saveNote = async (newNote) => {
  const realm = await getRealm();
  // 原业务逻辑保持不变
  const allData = realm.objects('Note');
  const dataLength = allData.length;
  let lastIdFromRealm = 0;
  if (dataLength !== 0) {
    lastIdFromRealm = allData[dataLength - 1].id;
  }
  if (newNote !== '') {
    realm.write(() => {
      realm.create('Note', {
        id: dataLength === 0 ? 1 : lastIdFromRealm + 1,
        note: newNote,
        date: new Date().toISOString(),
      });
    });
    alert('Successfully save your note!');
    const data = realm.objects('Note');
    console.log(data);
  } else {
    alert('Empty note!');
  }
};

2. 查看原生崩溃日志

  • Android:用Android Studio打开项目,通过Logcat过滤Realm或AndroidRuntime关键词,获取具体崩溃堆栈;
  • iOS:在Xcode中运行应用,查看控制台输出的崩溃信息,定位问题模块。

3. 重新安装Realm依赖

执行以下命令清理并重新安装:

# 卸载Realm
npm uninstall realm
# 清理npm缓存
npm cache clean --force
# 重新安装Realm
npm install realm
# iOS项目执行pod安装
cd ios && pod install && cd ..

4. 适配RN版本降级Realm

React Native 0.71.0与Realm 11.x可能存在兼容性问题,尝试降级到稳定兼容版本:

npm install realm@10.22.0

5. 检查Android权限(备选)

在AndroidManifest.xml中添加存储权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

内容的提问来源于stack exchange,提问作者Daily Works Project

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 05:05:36