我有一個簡單的應用程式,可以連接到 sqlite 資料庫,從該資料庫讀取結果并顯示它們。這是應用程式:
import React, { useEffect, useState } from 'react';
import { View, Text } from 'react-native'
import * as SQLite from "expo-sqlite";
import * as FileSystem from 'expo-file-system';
import { Asset } from 'expo-asset';
async function openDatabase() {
if (!(await FileSystem.getInfoAsync(FileSystem.documentDirectory 'SQLite')).exists) {
await FileSystem.makeDirectoryAsync(FileSystem.documentDirectory 'SQLite');
}
await FileSystem.downloadAsync(
Asset.fromModule(require('./assets/banana-dict.db')).uri,
FileSystem.documentDirectory 'SQLite/banana-dict.db'
);
return SQLite.openDatabase('banana-dict.db');
}
export default function App() {
const [ dicts, setDicts ] = useState([]);
const [ db, setDb ] = useState({
transaction: () => {
return {
executeSql: () => {},
};
}});
const updateDicts = (a) => {
setDicts(
Object.fromEntries(a.map(({rowid, ...rest}) => [rowid, rest]))
);
}
const fetchDicts = () => {
console.log('fetch')
db.transaction((tx) => {
tx.executeSql(
`select rowid, * from dicts;`,
[],
(_, { rows: { _array } }) => { console.log(_array); updateDicts(_array); }
);
});
}
useEffect(() => {
openDatabase().then((value) => {
setDb(value);
fetchDicts();
});
}, []);
return (
<View style={{marginTop: 100}}>
<Text>Open App.js to start working on your app!</Text>
<Text>{JSON.stringify(dicts)}</Text>
</View>
);
}
banana-dict.db是我用于此應用程式的預先存在的資料庫。我發現如果我啟動應用程式并在手機上打開它,dicts狀態(即資料庫上的查詢結果)不會出現。但是,如果我r在控制臺中按下重繪 ,結果會立即出現。有誰知道這是為什么?
uj5u.com熱心網友回復:
當應用程式啟動時,db會設定初始值。第一個效果批次setDb和fetchDicts,所以db.transaction沒有用setDb呼叫的值更新。因為Expo有狀態重繪 ,所以db不再設定為初始值而是有結果setDb,所以fetchDicts作業,結果出現。
解決此問題的一種方法是fetchDicts進入它自己的效果,并在db更改時呼叫它。
useEffect(() => {
openDatabase().then((value) => {
setDb(value);
});
}, []);
useEffect(() => {
fetchDicts(); // will do nothing until db connection is open
}, [db]);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/408016.html
標籤:
