如何从 React Native 中的 SQLite 查询中 return 另一个函数中的数据
How to return data in another function from a SQLite query in React Native
我是 React Native 的新手,我正在尝试从查询中推断数据,但“return”不起作用。也许是因为它需要承诺,我试过了,但我还不够好。我在 App 函数的视图组件中调用函数(在 App.js 中),像这样
<View>Search()</View>
但没有显示任何内容。如果我将 console.log 放入 search() (在另一个函数中)我可以看到结果,但我不能 return 它在我的 App.js 中(该函数已正确导入应用)
export function Search() {
db.transaction(
(tx) => {
tx.executeSql("select pver from profile where id=12524234", [],
(tx, results) => {
var a = JSON.stringify(results.rows._array[0].pver)
var data = Number(a)
return data;
});
},
null,
)
};
这就是我根据用户的建议尝试做的事情
//this in App.js
import {Search} from './Funzioni'
export default function App() {
const [searchResult, setSearchResult] = useState();
useEffect(() => {
console.log("we are in the useeffect")
Search().then((data)=>{
console.log("set") //doesn't appear
setSearchResult(data)
})
},[]);
//other codes
return (<View>{searchResult}</View> )
}
//this in "Funzioni.js"
export async function Search() {
return new Promise((resolve, reject) => {
db.transaction(
(tx) => {
tx.executeSql("select pver from profile where id=12524234", [],
(tx, results) => {
var a = JSON.stringify(results.rows._array[0].pver)
var data = Number(a)
console.log("the data: " + data) //doesn't appear
resolve(data);
});
},
null,
)
});
};
当您呈现组件时,事务方法是异步的,搜索功能仍未解析。
在您的组件中,您应该使用 useState 来存储数据并使用 useEffect 来获取数据
const [searchResult, setSearchResult] = useState('');
useEffect(() => {
Search().then((data)=>{
setSearchResult(data)
}).catch((error) => console.log(error));
},[]);
return <View>{searchResult}</View>
你的搜索功能应该是这样的
export async function Search() {
return new Promise((resolve, reject) => {
const db = SQLite.openDatabase('THE_NAME_OF_YOUR_DATABASE.db')
db.transaction(
(tx) => {
tx.executeSql("select pver from profile where id=12524234", [],
(tx, results) => {
var a = JSON.stringify(results.rows._array[0].pver)
var data = Number(a)
resolve(data);
},
function (error) {
reject(false);
throw new Error(
'Error: ' + error
);
});
},
function (error) {
reject(undefined);
throw new Error('error: ' + error.message);
},
function () {
console.log('ok');
}
)
});
};
我是 React Native 的新手,我正在尝试从查询中推断数据,但“return”不起作用。也许是因为它需要承诺,我试过了,但我还不够好。我在 App 函数的视图组件中调用函数(在 App.js 中),像这样
<View>Search()</View>
但没有显示任何内容。如果我将 console.log 放入 search() (在另一个函数中)我可以看到结果,但我不能 return 它在我的 App.js 中(该函数已正确导入应用)
export function Search() {
db.transaction(
(tx) => {
tx.executeSql("select pver from profile where id=12524234", [],
(tx, results) => {
var a = JSON.stringify(results.rows._array[0].pver)
var data = Number(a)
return data;
});
},
null,
)
};
这就是我根据用户的建议尝试做的事情
//this in App.js
import {Search} from './Funzioni'
export default function App() {
const [searchResult, setSearchResult] = useState();
useEffect(() => {
console.log("we are in the useeffect")
Search().then((data)=>{
console.log("set") //doesn't appear
setSearchResult(data)
})
},[]);
//other codes
return (<View>{searchResult}</View> )
}
//this in "Funzioni.js"
export async function Search() {
return new Promise((resolve, reject) => {
db.transaction(
(tx) => {
tx.executeSql("select pver from profile where id=12524234", [],
(tx, results) => {
var a = JSON.stringify(results.rows._array[0].pver)
var data = Number(a)
console.log("the data: " + data) //doesn't appear
resolve(data);
});
},
null,
)
});
};
当您呈现组件时,事务方法是异步的,搜索功能仍未解析。
在您的组件中,您应该使用 useState 来存储数据并使用 useEffect 来获取数据
const [searchResult, setSearchResult] = useState('');
useEffect(() => {
Search().then((data)=>{
setSearchResult(data)
}).catch((error) => console.log(error));
},[]);
return <View>{searchResult}</View>
你的搜索功能应该是这样的
export async function Search() {
return new Promise((resolve, reject) => {
const db = SQLite.openDatabase('THE_NAME_OF_YOUR_DATABASE.db')
db.transaction(
(tx) => {
tx.executeSql("select pver from profile where id=12524234", [],
(tx, results) => {
var a = JSON.stringify(results.rows._array[0].pver)
var data = Number(a)
resolve(data);
},
function (error) {
reject(false);
throw new Error(
'Error: ' + error
);
});
},
function (error) {
reject(undefined);
throw new Error('error: ' + error.message);
},
function () {
console.log('ok');
}
)
});
};