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

react-native-sqlite-storage连接报错:找不到person表

解决react-native-sqlite-storage "no such table: person" 错误

嘿,我来帮你搞定这个问题!你遇到的“no such table”错误,几乎可以肯定是预填充的数据库没有被正确加载到应用的可访问路径,或者打开数据库的方式不对。咱们一步步排查解决:

1. 修正数据库连接配置(最关键!)

你当前的openDatabase('mioDB')只会创建一个新的空数据库,根本没用到你assets里的预填充文件。必须添加createFromAsset等参数来指定加载预填充数据库:

import React,{Component} from 'react'; 
import {TextInput,View,Text,TouchableOpacity} from 'react-native'; 
import { openDatabase } from "react-native-sqlite-storage"; 

// 正确配置预填充数据库连接
const mioDB = openDatabase({
  name: 'mioDB.db', // 必须和assets里的文件名完全一致(带扩展名)
  location: 'default', // 指定数据库存储位置
  createFromAsset: 'mioDB.db' // 告诉库从assets目录拷贝预填充数据库
}); 

class App extends Component{ 
  constructor(props){ 
    super(props); 
    this.state={ name:'', lastName:'' }; 
  } 

  showData=()=>{ 
    alert('name: '+this.state.name+' lastName: '+this.state.lastName); 
  }; 

  listOfNames=()=>{ 
    try{ 
      mioDB.transaction((tx)=>{ 
        console.log('开始查询...'); 
        // 明确指定需要的字段,比SELECT *更高效
        tx.executeSql(
          'SELECT id, name, lastName FROM person',
          [],
          (tx, results)=>{ 
            console.log('查询成功,返回行数:', results.rows.length); 
            for (let i = 0; i < results.rows.length; i++) { 
              let row = results.rows.item(i); 
              console.log(`记录 ${i+1}: ID=${row.id}, 姓名=${row.name}, 姓氏=${row.lastName}`); 
            } 
          },
          // 新增错误回调,捕获更详细的错误信息
          (tx, error)=>{
            console.error('查询失败:', error);
            alert(`查询出错: ${error.message}`);
            return true; // 返回true终止事务
          }
        ); 
      }); 
    }catch(error){ 
      alert('事务异常: '+error.message); 
    } 
  }; 

  render(){ 
    return( 
      <View style={{marginTop:100, paddingHorizontal:20}}> 
        <TextInput 
          style={{fontSize:20, borderBottomWidth:1, marginBottom:10}} 
          placeholder='name' 
          onChangeText={(text)=>this.setState({name:text})}
        /> 
        <TextInput 
          style={{fontSize:20, borderBottomWidth:1, marginBottom:20}} 
          placeholder='lastName' 
          onChangeText={(text)=>this.setState({lastName:text})}
        /> 
        <TouchableOpacity style={{width:150,height:50, backgroundColor:'#eee', justifyContent:'center', alignItems:'center', marginBottom:10}} onPress={this.showData}>
          <Text>Create db</Text>
        </TouchableOpacity> 
        <TouchableOpacity style={{width:150,height:50, backgroundColor:'#eee', justifyContent:'center', alignItems:'center'}} onPress={this.listOfNames}>
          <Text>Show database</Text>
        </TouchableOpacity> 
      </View> 
    ); 
  } 
} 

export default App;

2. 验证预填充数据库本身

用SQLite可视化工具(比如SQLite Browser)打开你/android/app/src/main/assets/mioDB.db文件,确认:

  • person表确实存在
  • 表结构包含id、name、lastName字段
  • 数据库文件没有损坏

3. 确保Android端assets目录配置正确

检查android/app/build.gradle文件,确认assets目录被正确打包:

android {
    sourceSets {
        main {
            assets.srcDirs = ['src/main/assets']
        }
    }
}

如果没有这段配置,assets里的数据库文件可能不会被打包到APK中。

4. 清理缓存并重新构建

做完以上修改后,记得:

  • 卸载设备上的旧应用
  • 执行npm run android(或yarn android)重新构建安装

这样就能确保新的配置和数据库文件被正确加载啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:17:51