错误:未定义不是 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 和外部数据源渲染组件