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

Expo SQLite使用assetSource无法读取已有数据表问题求助

解决Expo SQLite导入资产数据库后找不到表的问题

以下是几个常见的排查和解决方向:

1. 确保Metro配置支持.db资产文件

Expo的Metro默认不会处理.db后缀的资产文件,需要手动添加到配置中:

  • 在项目根目录创建或修改metro.config.js,添加如下配置:
    const { getDefaultConfig } = require('expo/metro-config');
    
    const config = getDefaultConfig(__dirname);
    // 添加.db到资产扩展名列表
    config.resolver.assetExts.push('db');
    
    module.exports = config;
    

修改后执行expo start -c清除缓存并重启Metro服务。

2. 验证数据库是否被正确复制到设备目录

用expo-file-system检查目标路径的数据库是否存在:

import * as FileSystem from 'expo-file-system';

async function checkDbExists() {
  const dbPath = `${FileSystem.documentDirectory}SQLite/mydatabase.db`;
  const info = await FileSystem.getInfoAsync(dbPath);
  console.log('数据库文件状态:', info);
}

如果返回exists: false,说明资产复制失败,可尝试手动复制文件:

import { Asset } from 'expo-asset';
import * as FileSystem from 'expo-file-system';

async function copyDbManually() {
  const asset = Asset.fromModule(require('../assets/mydatabase.db'));
  await asset.downloadAsync();
  
  const destPath = `${FileSystem.documentDirectory}SQLite/mydatabase.db`;
  await FileSystem.copyAsync({
    from: asset.localUri,
    to: destPath,
  });
}

可在App初始化时调用该函数,替代SQLiteProvider的自动复制逻辑。

3. 确认数据库文件本身的有效性

  • 用本地SQLite工具(如DB Browser for SQLite)打开assets/mydatabase.db,确认:
    • 目标表确实存在(查看sqlite_master表)
    • 数据库格式为SQLite 3.x版本(Expo SQLite仅支持该版本)
    • 数据库文件没有损坏(工具能正常读取所有数据)

4. 确保数据库初始化完成后再执行查询

使用useSQLiteContext时,需等待数据库实例就绪后再执行查询:

import { useSQLiteContext } from 'expo-sqlite';
import { useEffect, useState } from 'react';
import { Text } from 'react-native';

function Body() {
  const db = useSQLiteContext();
  const [isDbReady, setIsDbReady] = useState(false);

  useEffect(() => {
    if (db) {
      // 验证数据库表
      db.getAllAsync('SELECT name FROM sqlite_master WHERE type="table"')
        .then(tables => console.log('存在的表:', tables))
        .finally(() => setIsDbReady(true));
    }
  }, [db]);

  if (!isDbReady) {
    return <Text>数据库加载中...</Text>;
  }

  // 后续业务逻辑
  return <Text>数据库就绪</Text>;
}

5. 清除Expo Go缓存

Expo Go的缓存可能导致旧的数据库文件被复用:

  • 完全关闭Expo Go应用(退出后台)
  • 执行expo start -c清除Metro缓存后重新启动项目
  • 若仍无效,可在设备设置中找到Expo Go,清除应用缓存

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 06:24:57