
En esta segunda parte, mejoraremos nuestra app de tareas de React Native con las siguientes mejoras:
- Persistencia avanzada con SQLite.
- Eliminación de tareas.
- Interfaz mejorada con Styled Components.
Requisitos previos
- Haber completado el primer tutorial: https://devcodelight.com/crea-una-app-de-tareas-con-react-native/.
- Haber instalado todas las dependencias de React Native y Expo.
1. Instalando SQLite
Expo proporciona un wrapper para SQLite, lo instalamos con:
npx expo install expo-sqlite
Creamos un archivo database.js en src/utils/ para manejar la base de datos:
import * as SQLite from 'expo-sqlite';
const db = SQLite.openDatabase('tasks.db');
export const setupDatabase = () => {
db.transaction(tx => {
tx.executeSql(
'CREATE TABLE IF NOT EXISTS tasks (id INTEGER PRIMARY KEY AUTOINCREMENT, text TEXT);'
);
});
};
export const getTasks = (callback) => {
db.transaction(tx => {
tx.executeSql('SELECT * FROM tasks;', [], (_, { rows }) => {
callback(rows._array);
});
});
};
export const addTask = (task, callback) => {
db.transaction(tx => {
tx.executeSql('INSERT INTO tasks (text) VALUES (?);', [task], () => {
getTasks(callback);
});
});
};
export const deleteTask = (id, callback) => {
db.transaction(tx => {
tx.executeSql('DELETE FROM tasks WHERE id = ?;', [id], () => {
getTasks(callback);
});
});
};
2. Modificar la Pantalla para Usar SQLite
Editamos HomeScreen.js:
import React, { useState, useEffect } from 'react';
import { View, Text, TextInput, Button, FlatList, TouchableOpacity } from 'react-native';
import { setupDatabase, getTasks, addTask, deleteTask } from '../utils/database';
export default function HomeScreen() {
const [task, setTask] = useState('');
const [tasks, setTasks] = useState([]);
useEffect(() => {
setupDatabase();
getTasks(setTasks);
}, []);
const handleAddTask = () => {
if (task.trim()) {
addTask(task, setTasks);
setTask('');
}
};
return (
<View style={{ padding: 20 }}>
<TextInput
placeholder="Nueva tarea"
value={task}
onChangeText={setTask}
style={{ borderBottomWidth: 1, marginBottom: 10 }}
/>
<Button title="Agregar" onPress={handleAddTask} />
<FlatList
data={tasks}
keyExtractor={(item) => item.id.toString()}
renderItem={({ item }) => (
<TouchableOpacity onPress={() => deleteTask(item.id, setTasks)}>
<Text>{item.text} ❌</Text>
</TouchableOpacity>
)}
/>
</View>
);
}
3. Aplicando Estilos con Styled Components
Instalamos Styled Components:
npm install styled-components
Modificamos HomeScreen.js para usar estilos:
import styled from 'styled-components/native'; const Container = styled.View` flex: 1; padding: 20px; background-color: #f8f9fa; `; const TaskInput = styled.TextInput` border-bottom-width: 1px; margin-bottom: 10px; padding: 5px; `; const TaskText = styled.Text` font-size: 18px; color: #333; `;
Dentro del return:
<Container>
<TaskInput
placeholder="Nueva tarea"
value={task}
onChangeText={setTask}
/>
<Button title="Agregar" onPress={handleAddTask} />
<FlatList
data={tasks}
keyExtractor={(item) => item.id.toString()}
renderItem={({ item }) => (
<TouchableOpacity onPress={() => deleteTask(item.id, setTasks)}>
<TaskText>{item.text} ❌</TaskText>
</TouchableOpacity>
)}
/>
</Container>
4. Probar la Aplicación
Ejecuta:
npx expo start
Verifica que las tareas se guardan y eliminan correctamente.

Ingeniero en Informática, Investigador, me encanta crear cosas o arreglarlas y darles una nueva vida. Escritor y poeta. Más de 20 APPs publicadas y un libro en Amazon.