Bird
Raised Fist0
React Nativemobile~5 mins

SQLite with expo-sqlite in React Native

Choose your learning style10 modes available
Introduction

SQLite lets your app save and read data on the device. Using expo-sqlite helps you work with SQLite easily in React Native apps.

You want to save user notes or settings locally on the phone.
You need to store a list of items that the user can add or remove.
You want to keep data available even when the app is closed or offline.
You want to organize data in tables and run simple queries.
You want a small database without needing an internet connection.
Syntax
React Native
import * as SQLite from 'expo-sqlite';
const db = SQLite.openDatabase('mydb.db');

db.transaction(tx => {
  tx.executeSql('SQL QUERY', [], (tx, results) => {
    // handle results
  });
});

Use openDatabase to create or open a database file.

Use transaction to run SQL commands safely.

Examples
Open or create a database named 'test.db'.
React Native
const db = SQLite.openDatabase('test.db');
Create a table called 'items' with columns 'id' and 'name' if it doesn't exist.
React Native
db.transaction(tx => {
  tx.executeSql('CREATE TABLE IF NOT EXISTS items (id INTEGER PRIMARY KEY NOT NULL, name TEXT);');
});
Insert a new item named 'Apple' into the 'items' table.
React Native
db.transaction(tx => {
  tx.executeSql('INSERT INTO items (name) VALUES (?);', ['Apple']);
});
Select all rows from 'items' and log them to the console.
React Native
db.transaction(tx => {
  tx.executeSql('SELECT * FROM items;', [], (tx, results) => {
    console.log(results.rows._array);
  });
});
Sample App

This app creates a local SQLite database and a table called 'items'. It shows a button to add new items. When you press the button, a new item is saved and the list updates to show all items.

React Native
import React, { useEffect, useState } from 'react';
import { View, Text, Button, FlatList } from 'react-native';
import * as SQLite from 'expo-sqlite';

const db = SQLite.openDatabase('mydb.db');

export default function App() {
  const [items, setItems] = useState([]);

  const fetchItems = () => {
    db.transaction(tx => {
      tx.executeSql('SELECT * FROM items;', [], (tx, results) => {
        setItems(results.rows._array);
      });
    });
  };

  const addItem = () => {
    const newItem = 'Item ' + (items.length + 1);
    db.transaction(tx => {
      tx.executeSql('INSERT INTO items (name) VALUES (?);', [newItem], () => {
        fetchItems();
      });
    });
  };

  useEffect(() => {
    db.transaction(tx => {
      tx.executeSql(
        'CREATE TABLE IF NOT EXISTS items (id INTEGER PRIMARY KEY NOT NULL, name TEXT);',
        [],
        () => fetchItems()
      );
    });
  }, []);

  return (
    <View style={{ flex: 1, padding: 20 }}>
      <Button title="Add Item" onPress={addItem} />
      <FlatList
        data={items}
        keyExtractor={item => item.id.toString()}
        renderItem={({ item }) => <Text>{item.name}</Text>}
      />
    </View>
  );
}
OutputSuccess
Important Notes

Always run database commands inside transaction for safety.

Use placeholders ? in SQL to avoid errors and injection.

Remember to update your UI state after database changes to show fresh data.

Summary

expo-sqlite lets you store data locally in a small database.

Open a database, create tables, insert and query data with SQL commands.

Use React state to show database data in your app interface.

Practice

(1/5)
1. What is the main purpose of using expo-sqlite in a React Native app?
easy
A. To store and manage data locally using a small database
B. To fetch data from a remote server
C. To style the app interface
D. To handle user authentication

Solution

  1. Step 1: Understand expo-sqlite functionality

    expo-sqlite provides a way to store data locally on the device using a SQLite database.
  2. Step 2: Compare options with expo-sqlite purpose

    Only To store and manage data locally using a small database describes local data storage with a database, which matches expo-sqlite's role.
  3. Final Answer:

    To store and manage data locally using a small database -> Option A
  4. Quick Check:

    expo-sqlite = local database storage [OK]
Hint: expo-sqlite is for local data storage, not remote or styling [OK]
Common Mistakes:
  • Confusing expo-sqlite with network data fetching
  • Thinking expo-sqlite handles UI styling
  • Assuming expo-sqlite manages user login
2. Which of the following is the correct way to open a database using expo-sqlite?
easy
A. const db = SQLite.newDatabase('mydb.db');
B. const db = SQLite.createDatabase('mydb.db');
C. const db = SQLite.connect('mydb.db');
D. const db = SQLite.openDatabase('mydb.db');

Solution

  1. Step 1: Recall expo-sqlite database opening method

    The correct method to open or create a database is openDatabase.
  2. Step 2: Match method names with options

    Only const db = SQLite.openDatabase('mydb.db'); uses openDatabase, which is the correct syntax.
  3. Final Answer:

    const db = SQLite.openDatabase('mydb.db'); -> Option D
  4. Quick Check:

    openDatabase() opens SQLite DB [OK]
Hint: Use openDatabase() to open or create SQLite DB [OK]
Common Mistakes:
  • Using createDatabase() which does not exist
  • Using connect() or newDatabase() which are invalid
  • Missing the correct method name openDatabase()
3. Given this code snippet, what will be logged to the console?
const db = SQLite.openDatabase('test.db');
db.transaction(tx => {
  tx.executeSql('CREATE TABLE IF NOT EXISTS items (id INTEGER PRIMARY KEY NOT NULL, name TEXT);');
  tx.executeSql('INSERT INTO items (name) VALUES (?)', ['apple']);
  tx.executeSql('SELECT * FROM items;', [], (_, { rows }) => {
    console.log(rows._array);
  });
});
medium
A. undefined
B. [{ id: 1, name: 'apple' }]
C. []
D. SyntaxError

Solution

  1. Step 1: Understand the SQL commands executed

    The code creates a table if missing, inserts one row with name 'apple', then selects all rows.
  2. Step 2: Analyze the SELECT query result

    The SELECT returns one row with id 1 and name 'apple', logged as an array of objects.
  3. Final Answer:

    [{ id: 1, name: 'apple' }] -> Option B
  4. Quick Check:

    Inserted row appears in SELECT result [OK]
Hint: Inserted rows appear in SELECT query result array [OK]
Common Mistakes:
  • Expecting empty array before insertion
  • Confusing rows._array with undefined
  • Assuming syntax error from correct SQL
4. What is wrong with this code snippet that tries to insert data into a SQLite table?
db.transaction(tx => {
  tx.executeSql('INSERT INTO users (name, age) VALUES (?, ?)', ['John']);
});
medium
A. The SQL statement has fewer values than placeholders
B. The table name is incorrect
C. The transaction method is missing a callback
D. The executeSql method cannot use placeholders

Solution

  1. Step 1: Check SQL placeholders and values

    The SQL has two placeholders (?, ?) but only one value 'John' is provided.
  2. Step 2: Identify mismatch causing error

    Mismatch between placeholders and values causes an error during execution.
  3. Final Answer:

    The SQL statement has fewer values than placeholders -> Option A
  4. Quick Check:

    Placeholders must match values count [OK]
Hint: Match number of ? placeholders with values array length [OK]
Common Mistakes:
  • Ignoring mismatch between placeholders and values
  • Assuming table name is wrong without checking
  • Thinking executeSql cannot use placeholders
5. You want to display a list of items stored in a SQLite table inside your React Native app. Which approach correctly updates the UI after fetching data from the database?
const [items, setItems] = useState([]);

useEffect(() => {
  db.transaction(tx => {
    tx.executeSql('SELECT * FROM items;', [], (_, { rows }) => {
      // What should go here?
    });
  });
}, []);
hard
A. items = rows._array;
B. return rows._array;
C. setItems(rows._array);
D. console.log(rows._array);

Solution

  1. Step 1: Understand React state update

    To update UI, React state setter setItems must be called with new data.
  2. Step 2: Identify correct way to update state

    Assigning directly to items or returning data won't update state; logging only shows data.
  3. Final Answer:

    setItems(rows._array); -> Option C
  4. Quick Check:

    Use setItems() to update state and UI [OK]
Hint: Use setState function to update React state after DB fetch [OK]
Common Mistakes:
  • Assigning directly to state variable instead of using setter
  • Returning data inside executeSql callback
  • Only logging data without updating state
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard