Skip to content

Instantly share code, notes, and snippets.

@dwijonarko
Created March 8, 2019 02:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dwijonarko/38f803ce8ddb77abadafbe4eadfe35fa to your computer and use it in GitHub Desktop.
Save dwijonarko/38f803ce8ddb77abadafbe4eadfe35fa to your computer and use it in GitHub Desktop.
React Native SQLite implementation
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