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

React Native中expo-sqlite报错求助:openDatabase未定义等问题

问题描述

我正在开发一款React Native移动端应用,想通过本地数据库存储数据减少服务器请求,但遇到了两个关键错误:

错误信息

  1. 数据库初始化错误

ERROR TypeError: 0, _expoSqlite.openDatabase is not a function (it is undefined), js engine: hermes

  1. 应用注册错误

ERROR Invariant Violation: "main" has not been registered. This can happen if:

  • Metro (the local dev server) is run from the wrong folder. Check if Metro is running, stop it and restart it in the current project.
  • A module failed to load due to an error and AppRegistry.registerComponent wasn't called., js engine: hermes

相关代码

负责数据库交互的StorageManager类代码如下:

import { openDatabase }  from 'expo-sqlite';

class StorageManager {
  constructor() {
    this.db = openDatabase("mostriDB");
  }

   initializeDatabase() {
    this.db.transaction(tx, error => {
      tx.executeSql(
        `CREATE TABLE IF NOT EXISTS users (
          uid INTEGER PRIMARY KEY,
          picture TEXT,
          pversion INTEGER
        )`
      );
      error = (e) => {onerror(e)
        this.db.transaction(transaction,error);
      };
    });
  }
}

预期实现数据库/表不存在时自动创建,但交互时触发了上述错误。


解决方案

1. 修复openDatabase未定义问题

  • 确保已正确安装依赖:执行命令 npx expo install expo-sqlite
  • 检查导入语句拼写,确认expo-sqlite包确实导出了openDatabase方法
  • 如果是裸React Native项目(非Expo托管工作流),expo-sqlite不兼容,建议替换为react-native-sqlite-storage

2. 修复"main"未注册问题

该错误通常是数据库初始化失败导致模块加载中断,进而未执行AppRegistry.registerComponent。解决第一个错误后大概率自动修复,额外可做:

  • 停止Metro服务,在项目根目录执行 npx expo start --clear 清除缓存并重启
  • 检查入口文件(通常是App.js或index.js),确保末尾有正确的注册代码:
    import { AppRegistry } from 'react-native';
    import App from './App';
    import { name as appName } from './app.json';
    
    AppRegistry.registerComponent(appName, () => App);
    

3. 修正StorageManager代码逻辑

原initializeDatabase方法存在回调参数错误、未定义变量等问题,修正后代码:

initializeDatabase() {
  this.db.transaction(
    (tx) => {
      tx.executeSql(
        `CREATE TABLE IF NOT EXISTS users (
          uid INTEGER PRIMARY KEY,
          picture TEXT,
          pversion INTEGER
        )`,
        [],
        () => console.log('表创建成功'),
        (_, err) => {
          console.error('创建表失败:', err);
          return false;
        }
      );
    },
    (err) => console.error('事务失败:', err),
    () => console.log('事务完成')
  );
}

内容的提问来源于stack exchange,提问作者Gianmarco Lobaccaro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 12:02:46