SQLite 数据库获取代码无法同步工作,因此我无法使用设置状态更新我的组件
SQLite database fetch code does not work synchronously therefore I cant update my component using set state
我正在尝试从 SQLite 数据库中获取数据,并在加载页面时将其呈现到我的本机平面列表中。但问题是数据获取需要一些时间,所以我的平面列表不会使用 setstate()
方法更新,因为 setstate 方法在从数据库获取数据之前执行。我正在使用 async await 和 promises 但我找不到解决方案。
我正在尝试异步等待、承诺等。
async componentDidMount()
{
const p=await this.datafun();
this.setState({
fdata:[...p],
flag:false
})
}
datafun()
{
var SQLite = require('react-native-sqlite-storage')
const db= SQLite.openDatabase({name :'anand.db', createFromLocation : 1});
db.transaction( function (txn) {
txn.executeSql('SELECT * FROM my_conyact ', [], function (tx, res) {
for (let i = 0; i <res.rows.length; ++i)
{
this.state.fdata=[...this.state.fdata,{ UNIT: res.rows.item(i).column5 }];
}
}.bind(this));
}.bind(this));
return new Promise((resolve)=>{
resolve(this.state.fdata);
})
}
我想在从数据库中获取数据并将值 return 写入 'const p' 后执行 setstate()
方法。
您的方向不错,但在如何使用 promise 方面存在一些错误。您做了 return 承诺,但没有执行承诺中的功能。
此外,我不确定是否推荐在 async 中强制转换 componentDidMount 语法,这里似乎更推荐一个关于它看起来像什么的想法
componentDidMount()
{
this.datafun().then(function(data) {
this.setState({
// HERE update your state
})
})
}
datafun()
{
var SQLite = require('react-native-sqlite-storage')
const db= SQLite.openDatabase({name :'anand.db', createFromLocation : 1});
return new Promise((resolve,reject)=>{
db.transaction( function (txn) {
txn.executeSql('SELECT * FROM my_conyact ', [], function (tx, res) {
resolve(res);
});
})
})
}
datafun() {
var SQLite = require('react-native-sqlite-storage')
const db = SQLite.openDatabase({ name: 'anand.db', createFromLocation: 1 });
return new Promise((resolve, reject) => {
db.transaction(function (txn) {
txn.executeSql('SELECT * FROM my_conyact ', [], function (tx, res) {
resolve(res);
});
})
})
}
componentDidMount() {
this.datafun().then((dt) => {
for (let i = 0; i < dt.rows.length; ++i) {
this.state.fdata = [...this.state.fdata, { UNIT: dt.rows.item(i).column5 }]
}
this.setState(
{
fdata: [...this.state.fdata],
flag: false,
}
)
})
}
终于明白了!!!
我正在尝试从 SQLite 数据库中获取数据,并在加载页面时将其呈现到我的本机平面列表中。但问题是数据获取需要一些时间,所以我的平面列表不会使用 setstate()
方法更新,因为 setstate 方法在从数据库获取数据之前执行。我正在使用 async await 和 promises 但我找不到解决方案。
我正在尝试异步等待、承诺等。
async componentDidMount()
{
const p=await this.datafun();
this.setState({
fdata:[...p],
flag:false
})
}
datafun()
{
var SQLite = require('react-native-sqlite-storage')
const db= SQLite.openDatabase({name :'anand.db', createFromLocation : 1});
db.transaction( function (txn) {
txn.executeSql('SELECT * FROM my_conyact ', [], function (tx, res) {
for (let i = 0; i <res.rows.length; ++i)
{
this.state.fdata=[...this.state.fdata,{ UNIT: res.rows.item(i).column5 }];
}
}.bind(this));
}.bind(this));
return new Promise((resolve)=>{
resolve(this.state.fdata);
})
}
我想在从数据库中获取数据并将值 return 写入 'const p' 后执行 setstate()
方法。
您的方向不错,但在如何使用 promise 方面存在一些错误。您做了 return 承诺,但没有执行承诺中的功能。
此外,我不确定是否推荐在 async 中强制转换 componentDidMount 语法,这里似乎更推荐一个关于它看起来像什么的想法
componentDidMount()
{
this.datafun().then(function(data) {
this.setState({
// HERE update your state
})
})
}
datafun()
{
var SQLite = require('react-native-sqlite-storage')
const db= SQLite.openDatabase({name :'anand.db', createFromLocation : 1});
return new Promise((resolve,reject)=>{
db.transaction( function (txn) {
txn.executeSql('SELECT * FROM my_conyact ', [], function (tx, res) {
resolve(res);
});
})
})
}
datafun() {
var SQLite = require('react-native-sqlite-storage')
const db = SQLite.openDatabase({ name: 'anand.db', createFromLocation: 1 });
return new Promise((resolve, reject) => {
db.transaction(function (txn) {
txn.executeSql('SELECT * FROM my_conyact ', [], function (tx, res) {
resolve(res);
});
})
})
}
componentDidMount() {
this.datafun().then((dt) => {
for (let i = 0; i < dt.rows.length; ++i) {
this.state.fdata = [...this.state.fdata, { UNIT: dt.rows.item(i).column5 }]
}
this.setState(
{
fdata: [...this.state.fdata],
flag: false,
}
)
})
}
终于明白了!!!