错误:未定义不是 ReactNative 中的对象(评估“db.transaction”)

Posted

技术标签:

【中文标题】错误:未定义不是 ReactNative 中的对象(评估“db.transaction”)【英文标题】:Error : undefined is not an object (evaluating 'db.transaction') in ReactNative 【发布时间】:2018-06-08 06:19:18 【问题描述】:

我正在遵循从现有 ios 数据库中填充值的所有说明:link

并使用以下代码:

import SQLite from 'react-native-sqlite-storage';
var db; 
export default class App extends Component<Props> 
errorCB(err) 
  console.log("SQL Error: " + err);
;

successCB() 
  console.log("SQL executed fine");
;

openCB() 
  console.log("Database OPENED");
;

openDB() 
db = SQLite.openDatabase(name : "sqliteexample", createFromLocation : 1, this.openCB, this.errorCB);



populateDB() 
  db.transaction((tx) => 
    tx.executeSql("SELECT * FROM Users", [], (tx, results) => 
        console.log("Query completed");

        // Get rows with Web SQL Database spec compliance.

        var len = results.rows.length;
        console.log('len' + len)
        for (let i = 0; i < len; i++) 
          let row = results.rows.item(i);
          console.log(`User: $row`);
        
      );
  );


render() 
    return (
<View style=styles.container >
<Button onPress=this. openDB
         title="open Database"
         color="#841584"/>
<Button onPress=this. populateDB
         title="Get Data"
         color="#841584"/>
      </View>
    );
  

我收到此错误:

undefined 不是对象(评估 'db.transaction')

但成功打开数据库在控制台中收到以下消息:

2018-06-08 11:43:40.678 [info][tid:com.facebook.react.SQLiteQueue][SQLite.m:255] 打开 cb 完成 2018-06-08 11:43:40.679 [info][tid:com.facebook.react.javascript] 数据库打开:sqliteexample 2018-06-08 11:43:40.679165+0530 FlatListAppDemo[1018:61832] 打开 cb 完成 2018-06-08 11:43:40.679220+0530 FlatListAppDemo[1018:61820] 数据库打开:sqliteexample

请帮我解决这个问题。 提前致谢。

【问题讨论】:

【参考方案1】:

你可以这样试试

import SQLite from 'react-native-sqlite-storage';
var database_name = "sqliteexample"; // Add your Database name
var database_version = "1.0"; // Add your Database Version
var database_size = 200000; // Add your Database Size
var database_displayname = "SQL Database"; // Add your Database Displayname
var db; 

export default class App extends Component<Props> 
errorCB(err) 
  console.log("SQL Error: " + err);
;

successCB() 
  console.log("SQL executed fine");
;

openCB() 
  console.log("Database OPENED");
;

openDB() 

 db = SQLite.openDatabase(database_name, database_version, database_displayname, database_size, this.openCB, this.errorCB);



populateDB() 

  db = SQLite.openDatabase(database_name, database_version, database_displayname, database_size, this.openCB, this.errorCB);
  db.transaction((tx) => 
    tx.executeSql("SELECT * FROM Users", [], (tx, results) => 
        console.log("Query completed");

        // Get rows with Web SQL Database spec compliance.

        var len = results.rows.length;
        console.log('len' + len)
        for (let i = 0; i < len; i++) 
          let row = results.rows.item(i);
          console.log(`User: $row`);
        
      );
  );


render() 
    return (
<View style=styles.container >
<Button onPress=this. openDB
         title="open Database"
         color="#841584"/>
<Button onPress=this. populateDB
         title="Get Data"
         color="#841584"/>
      </View>
    );
  

【讨论】:

打开的数据库中不存在问题,调用 populateDB 时发生错误并显示:未定义不是对象(评估 'db.transaction') db 变量没有数据库引用,这就是发生错误的原因 那么,解决方案是什么?你更新的答案也抛出了同样的错误.. db 引用未在变量 db 中正确设置,这就是发生“db.transaction”错误的原因 你确定数据库名称是 'sqliteexample' 正确吗?【参考方案2】:

所以我认为这可能只是时间问题。获取数据库对象的最安全方法是在成功回调中,如果在 openDatabase 中一切顺利,它将接收一个有效的 db 对象。所以把你的代码改成这个然后试试吧……

openCB(myDB) 
  console.log("Database OPENED");
  db = myDB;
;

openDB() 
  SQLite.openDatabase(name : "sqliteexample", createFromLocation : 1, this.openCB, this.errorCB);


【讨论】:

以上是关于错误:未定义不是 ReactNative 中的对象(评估“db.transaction”)的主要内容,如果未能解决你的问题,请参考以下文章

React Native - 渲染从 API 获取数据的屏幕时出现“未定义不是对象”错误

React Native - 未定义不是对象(评估'Items.Length')

未定义不是本机反应中的对象错误

React Native:“未定义不是对象”使用 ListView 和外部数据源渲染组件

TypeError:未定义不是对象(评估'_ref.state)

TypeError:未定义不是对象(评估'array.length')反应原生[关闭]