启动时创建一次sqlite数据库



我正在为我当地的大学举办黑客马拉松,这是我第一次与react native合作,我在react方面有一些可衡量的技能,我想学习新东西,现在我想在打开"landing page"时创建一个数据库表,它可以工作,但不是我想要的方式。我想创建一次表,如果它们存在,我不想发生任何事情,但它们会被覆盖,然后每次都会清除记录,这会让创建帐户的人感到沮丧。我想开始将数据库与我的前端集成,并完成应用程序,但我一直在这个问题上。任何想法

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,   
}
});

如果这是您的实际代码,则无法覆盖表,因为您在CREATE TABLE语句中使用了IF NOT EXISTS

代码中有一个问题的部分是这个查询:

SELECT name 
FROM sqlite_master 
WHERE type='table' AND name='user' AND name='data'

显然,您试图通过执行上面的查询来确定这两个表是否已经存在,但您的逻辑是错误的
此查询从不返回一行,因为列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...语句,仅此而已

此外,请检查是否有删除数据库的代码,因此当您重新启动应用程序时,会重新创建数据库。

最新更新