---
title: Quick Start
description: Getting started with Realtime Database in React Native Firebase
---
# Realtime Database Quick Start
## Installation
This module depends on the `@react-native-firebase/app` module. To get started and install `app`,
visit the project's quick start guide.
Install this module with Yarn:
```bash
yarn add @react-native-firebase/database
```
> Integrating manually and not via React Native auto-linking? Check the setup instructions for Android & iOS.
## Module usage
Once installed, import the Cloud Functions package into your project:
```js
import database from '@react-native-firebase/database';
```
The package also provides access to the firebase instance:
```js
import { firebase } from '@react-native-firebase/database';
```
### Read and Write Data
To read data from the database, a `Reference` to the record is created, then data can be asynchronously fetched via the
`once` method:
```js
import auth from '@react-native-firebase/auth';
import database from '@react-native-firebase/database';
async function onSignIn() {
// Get the users ID
const uid = auth().currentUser.uid;
// Create a reference
const ref = database().ref(`/users/${uid}`);
// Fetch the data snapshot
const snapshot = await ref.once('value');
console.log('User data: ', snapshot.val());
}
```
To write data to the database, the created `Reference` exposes the `set` method which overwrites the data at the given
data reference:
```js
import auth from '@react-native-firebase/auth';
import database from '@react-native-firebase/database';
async function onCreateAccount() {
// Get the users ID
const uid = auth().currentUser.uid;
// Create a reference
const ref = database().ref(`/users/${uid}`);
await ref.set({
uid,
name: 'Joe Bloggs',
role: 'admin',
});
}
```
### Realtime Data Sync
Updating your app or UI in realtime as data changes on the database makes building realtime apps such as chat applications
a lot simpler. References creates expose an `on` method, which allows subscriptions to various realtime events such as
data changing, being added, being removed or moved to another location.
```jsx
import React, { useState, useEffect } from 'react';
import { Text } from 'react-native';
import database from '@react-native-firebase/database';
function Role({ uid }) {
const [initilizing, setInitilizing] = useState(true);
const [role, setRole] = useState(null);
// Subscriber handler
function onRoleChange(snapshot) {
// Set the role from the snapshot
setRole(snapshot.val());
// Connection established
if (initilizing) setInitilizing(false);
}
useEffect(() => {
// Create reference
const ref = database().ref(`/users/${uid}/role`);
// Subscribe to value changes
ref(`/users/${uid}/role`).on('value', onRoleChange);
// Unsubscribe from changes on unmount
return () => ref.off('value', onRoleChange);
}, [uid]);
// Wait for first connection
if (initilizing) return null;
return {role};
}
```
### FlatList and lists of data
In applications it is common to list repeating data rather than a single value, for example listing a scrollable view of
games which the user can select and navigate to. If a snapshot value is an array, the snapshot provides `forEach` method
to ensure the data can be displayed in-order as it appears on the database, as the standard `val` method does not
guarantee order.
Combining the result with a React Native [`FlatList`](https://facebook.github.io/react-native/docs/flatlist) makes creating
a performant, scrollable list simple:
```jsx
import React, { useState, useEffect } from 'react';
import { Text, FlatList } from 'react-native';
import database from '@react-native-firebase/database';
function Games() {
const [loading, setLoading] = useState(true);
const [games, setGames] = useState([]);
// Handle snapshot response
function onSnapshot(snapshot) {
const list = [];
// Create our own array of games in order
snapshot.forEach(game => {
list.push({
key: game.id, // Add custom key for FlatList usage
...game,
});
});
setGames(list);
setLoading(false);
}
useEffect(() => {
// Create reference
const ref = database().ref(`/games`);
ref.once('value', onSnapshot);
}, [uid]);
if (loading) {
return Loading games...;
}
return {item.name}} />;
}
```
### Enable Offline Capabilities
React Native Firebase provides support for offline data caching, using the native Firebase SDKs.
By enabling persistence, any data that the Firebase Realtime Database client would sync while online persists to disk and is available offline, even when the user or operating system restarts the app. This means your app works as it would online by using the local data stored in the cache. Listener callbacks will continue to fire for local updates. Read more on the [Firebase docs](https://firebase.google.com/docs/database/android/offline-capabilities).
Persistence can be enabled by using the `setPersistenceEnabled()` method. The size of the database cache can also be controlled via the `setPersistenceCacheSizeBytes()` method.
It is important to call these methods as early on in your app lifecycle as possible, before any database call has been triggered. If this does not happen, your persistence preferences will only be applied on the next application start.
```js
import database from '@react-native-firebase/database';
firebase.database().setPersistenceEnabled(true);
firebase.database().setPersistenceCacheSizeBytes(2000000); // 2MB
function bootstrapApp() { ... };
// Ensure methods are called before any application logic occurs
bootstrapApp();
```