我正在為當地大學舉辦黑客馬拉松,這是我第一次使用 React Native,我在 React 方面有一些可衡量的技能,我想學習新事物,現在我想在"landing page"
打開a 時創建一個資料庫表,它有效,只是不是我想要的方式。我想創建一次表,如果它們存在,我不希望發生任何事情,但是它們會被覆寫,然后每次都會清除記錄,這會造成沮喪,以便一遍又一遍地創建帳戶。我想開始將資料庫與我的前端集成并完成應用程式,但我遇到了這個問題。有任何想法嗎
import React, {Component, useEffect} from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
import { Image, View, Text, StyleSheet, Dimensions, StatusBar, Layout, TouchableOpacity } from 'react-native';
import Logo from '../components/assets/logo.png'
import Login from './Login';
import { openDatabase } from 'react-native-sqlite-storage';
import SignUp from './SignUp';
import Dash from './Dashboard';
import Reminder from './Reminder';
var db = openDatabase({ name: 'UserDatabase.db' });
function LoginPage(){
}
function Welcome({navigation}){
useEffect(() => {
db.transaction(function (txn) {
txn.executeSql(
"SELECT name FROM sqlite_master WHERE type='table' AND name='user' AND name='data'",
[],
function (tx, res) {
console.log('item:', res.rows.length);
if (res.rows.length == 0) {
txn.executeSql(
'CREATE TABLE IF NOT EXISTS user(user_id VARCHAR(75) PRIMARY KEY, Full_Name VARCHAR(75), Email VARHCAR(75), user_Password VARHCAR(75))',
'CREATE TABLE IF NOT EXISTS data(id INTEGER PRIMARY KEY AUTOINCREMENT, content VARCHAR(75), date VARCHAR(75), Type VARCHAR(75), Completed VARCHAR(5))',
[]
);
alert('Created database');
}else {
alert('database failed');
}
}
);
});
}, []);
return (
<View style={style.root}>
<Image source={Logo} style={style.icon} />
<Text style={style.title}>Note-ify</Text>
<View style={style.container}>
<Text style={style.caption}>Welcome</Text>
<Text style={style.message}>
Welcome To Note-ify. The all in one platform to manage your time effectively.
To begin your journey please start by logging in or signing up. ITS FREE!
</Text>
<View style={style.parent}>
<TouchableOpacity
title="Login"
style={style.login}
onPress={() => navigation.navigate('Login')}>
<Text style={style.login_caption}>Login</Text>
</TouchableOpacity>
<TouchableOpacity
title="Sign Up"
style={style.signup}
onPress={() => navigation.navigate('Register')}>
<Text style={style.signup_content}>Sign Up</Text>
</TouchableOpacity>
</View>
</View>
</View>
);
}
const Stack = createNativeStackNavigator();
function App(){
return (
<NavigationContainer>
<Stack.Navigator>
<Stack.Screen name="Welcome" component={Welcome} options={{headerShown: false}}/>
<Stack.Screen name="Login" component={Login} options={{headerShown: false}}/>
<Stack.Screen name="Register" component={SignUp} options={{headerShown: false}}/>
<Stack.Screen name="Dash" component={Dash} options={{headerShown: false}} />
<Stack.Screen name="Reminder" component={Reminder} options={{headerShown: false}}/>
</Stack.Navigator>
</NavigationContainer>
);
}
export default App;
const style = StyleSheet.create({
root:{
width: Dimensions.get('window').width,
height: Dimensions.get('window').height,
},
icon:{
alignSelf: 'center',
justifyContent: 'center',
width: 100,
height: 100,
marginTop: 85,
position:'absolute',
zIndex:1,
},
title:{
marginTop: 200,
fontSize: 26,
alignSelf: 'center',
justifyContent: 'center',
},
container:{
position: 'absolute',
backgroundColor: '#ffb900',
width: '100%',
height: 350,
borderTopRightRadius: 45,
borderTopLeftRadius: 45,
bottom: 0,
},
parent:{
flex: 1,
flexDirection: "row",
justifyContent: 'center',
},
caption:{
fontSize: 28,
paddingLeft: 25,
paddingTop: 15,
fontWeight: 'bold',
},
message:{
fontSize: 18,
paddingLeft: 20,
paddingTop: 20,
},
login:{
width: 120,
height: 45,
backgroundColor: '#111',
marginLeft: 25,
marginTop: 25,
borderRadius: 25
},
login_caption:{
color: '#fff',
textAlign: 'center',
justifyContent: 'center',
paddingTop: 12,
},
signup:{
width: 120,
height: 45,
backgroundColor: '#fff',
marginLeft: 25,
marginTop: 25,
borderRadius: 25
},
signup_content:{
color:'#111',
textAlign: 'center',
justifyContent: 'center',
paddingTop: 12,
}
});
uj5u.com熱心網友回復:
如果這是你實際的代碼,那么有沒有辦法,因為你正在使用覆寫表IF NOT EXISTS
的CREATE TABLE
陳述句。
代碼中有問題的部分是此查詢:
SELECT name
FROM sqlite_master
WHERE type='table' AND name='user' AND name='data'
顯然,您試圖通過執行上述查詢來確定這 2 個表是否已經存在,但是您的邏輯是錯誤的。
此查詢永遠不會回傳一行,因為在同一行中該列name
不可能等于'user'
AND 'data'
。
如果您使用運算子OR
而不是 ,則可以獲得結果AND
:
SELECT name
FROM sqlite_master
WHERE type='table' AND (name='user' OR name='data')
但是,這將回傳 0 或 1 或 2 行,具體取決于任一表的存在。
在任何情況下,洗掉此查詢,因為它根本不需要。
您所需要的只是 2 個CREATE TABLE IF NOT EXISTS...
陳述句,僅此而已。
另外,檢查是否有洗掉資料庫的代碼,因此當您重新啟動應用程式時,會重新創建資料庫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/385849.html