import React, { useState } from 'react'; import { ScrollView, StyleSheet, Text, TextInput, TouchableOpacity, View } from 'react-native'; import Constants from 'expo-constants'; import * as SQLite from 'expo-sqlite'; const db = SQLite.openDatabase("db.db"); function Items({ done: doneHeading, onPressItem }) { const [items, setItems] = React.useState(null); React.useEffect(() => { db.transaction(tx => { tx.executeSql( `select * from items where done = ?;`, [doneHeading ? 1 : 0], (_, { rows: { _array } }) => setItems(_array) ); }); }, []); const heading = doneHeading ? "Completed" : "Todo"; if (items === null || items.length === 0) { return null; } return ( {heading} {items.map(({ id, done, value }) => ( onPressItem && onPressItem(id)} style={{ backgroundColor: done ? "#1c9963" : "#fff", borderColor: "#000", borderWidth: 1, padding: 8 }} > {value} ))} ); } export default function App() { const [text, setText] = React.useState(null) const [forceUpdate, forceUpdateId] = useForceUpdate() React.useEffect(() => { db.transaction(tx => { tx.executeSql( "create table if not exists items (id integer primary key not null, done int, value text);" ); }); }, []); const add = (text) => { // is text empty? if (text === null || text === "") { return false; } 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, forceUpdate ); } return ( SQLite Example setText(text)} onSubmitEditing={() => { add(text); setText(null); }} placeholder="what do you need to do?" style={styles.input} value={text} /> db.transaction( tx => { tx.executeSql(`update items set done = 1 where id = ?;`, [ id ]); }, null, forceUpdate ) } /> db.transaction( tx => { tx.executeSql(`delete from items where id = ?;`, [id]); }, null, forceUpdate ) } /> ); } function useForceUpdate() { const [value, setValue] = useState(0); return [() => setValue(value + 1), value]; } 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: 8 }, listArea: { backgroundColor: "#f0f0f0", flex: 1, paddingTop: 16 }, sectionContainer: { marginBottom: 16, marginHorizontal: 16 }, sectionHeading: { fontSize: 18, marginBottom: 8 } });