React Native+Expo+WatermelonDB遇DatabaseBridge null错误求助
作为刚接触React Native和WatermelonDB的开发者,这个错误确实容易踩坑,我帮你梳理下问题根源和修复步骤:
1. 核心问题:Expo环境下误用了原生SQLite适配器
这是导致DatabaseBridge为null的最主要原因。WatermelonDB的SQLiteAdapter是给原生React Native项目用的,需要链接原生模块,但Expo是纯JS托管环境,不支持原生模块链接,所以必须改用Expo专用的适配器:
修复步骤:
- 首先确保安装了
expo-sqlite依赖:expo install expo-sqlite - 修改App.js中的适配器导入和初始化:
// 替换原来的SQLiteAdapter导入 import ExpoSQLiteAdapter from '@nozbe/watermelondb/adapters/expo'; // 初始化适配器 const adapter = new ExpoSQLiteAdapter({ dbName: "StudentTable", schema: mySchema, // Expo环境下暂不支持加密,若不需要可忽略此配置 // encryptionKey: 'your-encryption-key', });
2. Tution.js中的明显代码错误
你的Tution组件是类组件,但混用了React Hooks,这本身就是不允许的,会引发运行时错误,同时还有几个逻辑错误:
2.1 类组件中误用React Hooks
在Tution的render方法里,你写了:
const [checked,setChecked]=React.useState('Bank')
Hooks只能在函数组件或自定义Hooks中使用,类组件里不能用。如果需要这个状态,把它移到constructor的state里:
constructor(props) { super(props); this.state={ toggle:true, checked: 'Bank' // 把Hooks的状态移到这里 }; // ... 其他初始化代码 }
然后在render里用this.state.checked和this.setState({ checked: newValue })来操作。
2.2 新增学生时的变量名错误
在handleAddNewStudent方法里,你写了:
const newStudent = await movies.create(student => {
但前面你获取的是students集合:
const students = database.collections.get("students");
所以应该改成students.create:
const newStudent = await students.create(student => {
2.3 Date字段的状态不匹配
你的DatePicker绑定的是FeesDate状态:
onDateChange={FeesDate => this.setState({ FeesDate })}
但在创建学生时却用了this.state.date,应该改成this.state.FeesDate:
student.date = this.state.FeesDate;
另外,WatermelonDB的date字段需要是Date类型,确保你的schema里date字段是date()类型,并且传递的是Date对象。
2.4 WatermelonDB模型更新方法错误
在handleUpdateStudent里,你调用了student.updateStudent(),但WatermelonDB的模型更新应该用内置的update方法:
await student.update(student => { student.StudentName = this.state.StudentName; student.Std = this.state.Std; // ... 其他需要更新的字段 });
而不是自定义的updateStudent方法(除非你的Model类里自己实现了这个方法,但从代码看你没有)。
3. 其他检查点
- 确保你的
mySchema和dbModels配置正确,特别是students集合的字段和Tution里用到的字段一致。 - 确保在Expo项目中没有使用需要原生链接的WatermelonDB功能,比如加密(Expo不支持)。
按照这些步骤修复后,应该能解决DatabaseBridge的错误,同时修复Tution组件里的其他问题。
内容的提问来源于stack exchange,提问作者yash b

