Created
March 8, 2019 02:04
-
-
Save dwijonarko/38f803ce8ddb77abadafbe4eadfe35fa to your computer and use it in GitHub Desktop.
React Native SQLite implementation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import React from 'react'; | |
import { StyleSheet, Text, View, TextInput, TouchableOpacity } from 'react-native'; | |
import { Constants, SQLite } from 'expo'; | |
const db = SQLite.openDatabase('db.db'); | |
class Items extends React.Component { | |
state = { | |
items: null | |
}; | |
componentDidMount() { | |
this.update(); | |
} | |
render() { | |
const { done: doneHeading } = this.props; | |
const { items } = this.state; | |
const heading = doneHeading ? 'Completed' : 'Todo'; | |
if (items === null || items.length === 0) { | |
return null; | |
} | |
return ( | |
<View style={{ marginBottom: 16, marginHorizontal: 16 }}> | |
<Text style={styles.sectionHeading}>{heading}</Text> | |
{items.map(({ id, done, value }) => ( | |
<TouchableOpacity | |
key={id} | |
onPress={() => this.props.onPressItem && this.props.onPressItem(id)} | |
style={{ | |
backgroundColor: done ? '#1c9963' : '#fff', | |
borderColor: '#000', | |
borderWidth: 1, | |
padding: 8 | |
}}> | |
<Text style={{ color: done ? '#fff' : '#000' }}>{value}</Text> | |
</TouchableOpacity> | |
))} | |
</View> | |
); | |
} | |
update() { | |
db.transaction(tx => { | |
tx.executeSql( | |
'select * from items where done = ?;', | |
[this.props.done ? 1 : 0], | |
(_, { rows: { _array } }) => this.setState({ items: _array }) | |
); | |
}); | |
} | |
} | |
export default class App extends React.Component { | |
state = { | |
text: null | |
}; | |
componentDidMount() { | |
db.transaction(tx => { | |
tx.executeSql( | |
'create table if not exists items (id integer primary key not null, done int, value text);' | |
); | |
}); | |
} | |
render() { | |
return ( | |
<View style={styles.container}> | |
<Text style={styles.heading}>SQLite Example</Text> | |
<View style={styles.flexRow}> | |
<TextInput | |
style={styles.input} | |
placeholder="what do you need to do?" | |
value={this.state.text} | |
onChangeText={text => this.setState({ text })} | |
onSubmitEditing={() => { | |
this.add(this.state.text); | |
this.setState({ text: null }); | |
}} | |
/> | |
</View> | |
<View style={styles.listArea}> | |
<Items | |
done={false} | |
ref={todo => (this.todo = todo)} | |
onPressItem={id => | |
db.transaction( | |
tx => { | |
tx.executeSql(`update items set done = 1 where id = ?;`, [id]); | |
}, | |
null, | |
this.update | |
)} | |
/> | |
<Items | |
done={true} | |
ref={done => (this.done = done)} | |
onPressItem={id => | |
db.transaction( | |
tx => { | |
tx.executeSql(`delete from items where id = ?;`, [id]); | |
}, | |
null, | |
this.update | |
)} | |
/> | |
</View> | |
</View> | |
); | |
} | |
add(text) { | |
db.transaction( | |
tx => { | |
tx.executeSql('insert into items (done, value) values (0, ?)', [text]); | |
tx.executeSql('select * from items', [], (_, { rows }) => | |
console.log(JSON.stringify(rows)) | |
); | |
}, | |
null, | |
this.update | |
); | |
} | |
update = () => { | |
this.todo && this.todo.update(); | |
this.done && this.done.update(); | |
}; | |
} | |
const styles = StyleSheet.create({ | |
container: { | |
backgroundColor: '#fff', | |
flex: 1, | |
paddingTop: Constants.statusBarHeight, | |
}, | |
heading: { | |
fontSize: 20, | |
fontWeight: 'bold', | |
textAlign: 'center' | |
}, | |
flexRow: { | |
flexDirection: 'row' | |
}, | |
input: { | |
borderColor: '#4630eb', | |
borderRadius: 4, | |
borderWidth: 1, | |
flex: 1, | |
height: 48, | |
margin: 16, | |
padding: 5 | |
}, | |
listArea: { | |
backgroundColor: '#f0f0f0', | |
flex: 1, | |
paddingTop: 16 | |
}, | |
sectionHeading: { | |
fontSize: 18, | |
marginBottom: 8 | |
}, | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment