React Native Realm Database
Here is an Example of Realm Database in React Native. We are hoping you have read our previous post on Local Database in React Native App. A realm is an open-source object database management system, initially for mobile, also available for platforms such as Xamarin or React Native, and others, including desktop applications, and is licensed under the Apache License. We can perform all the CRUD transactions in this database and much faster than the SQLite database. Let’s get started with the Realm.
In this example, we will make a HomeScreen with the option to go to other screens like
- RegisterUser: To Register the User. (Create/Insert)
- ViewAllUser: To View All Users. (Read)
- ViewUser: To View Singel Users By Id. (Read)
- UpdateUser: To Update the User.(Update)
- DeleteUser: To Delete the User.
We will be having some custom components like Mybutton, Mytext, Mytextinput which will be used in place of react-native Button, Text, and TextInput.
How to Use Realm?
You just have to import the library like this:
import { Realm } from 'realm';
and open the database using
let realm = new Realm({ path: 'UserDatabase.realm' })
Now, whenever you need to make some database call you can use realm to execute the database query
realm.write(() => {
Do CRUD Operation here (Read operation can be performed directly)
});
To Make a React Native App
Getting started with React Native will help you to know more about the way you can make a React Native project. We are going to use react native command line interface to make our React Native App.
If you have previously installed a global react-native-cli package, please remove it as it may cause unexpected issues:
npm uninstall -g react-native-cli @react-native-community/cli
Run the following commands to create a new React Native project
npx react-native init ProjectName
If you want to start a new project with a specific React Native version, you can use the --version argument:
npx react-native init ProjectName --version X.XX.X
Note If the above command is failing, you may have old version of react-native
or react-native-cli
installed globally on your pc. Try uninstalling the cli and run the cli using npx.
This will make a project structure with an index file named App.js in your project directory.
Installation of Dependencies
Note: Realm library does not support node version 10 yet so if you want to use this library then you have to downgrade the node version if you are using the node version >= 10.
To manage this downgrade and upgrade of node version we have a simple solution and that is to use “n”. It is a very useful tool to manage node.js versions interactively, please visit Manage Different Node.js Versions in a Single Terminal with Ease using n for more info about the n.
We recommend you to use node version 9.8.0 as we have used the same version to create the example.
This example is updated for the React Navigation 4.0+. For more about React Navigation 4 please have a look at Using React Navigation 4.0 in React Native apps.
To install the dependencies open the terminal and jump into your project
cd ProjectName
1. Install realm
dependency to use RealM
npm install realm --save
2. Install react-navigation
dependency to import createAppContainer
npm install react-navigation --save
3. Other supporting libraries for react-navigation
npm install react-native-gesture-handler react-native-safe-area-context @react-native-community/masked-view react-native-screens react-native-reanimated --save
4. Install react-navigation-stack
to import createStackNavigator
npm install react-navigation-stack --save
These commands will copy all the dependencies into your node_module directory.
Linking of Dependencies
After the updation of React Native 0.60, they have introduced autolinking feature means we do not require to link the library but they have also mentioned that some libraries need linking and realm
is one of those cases. So for that, we need to link the library using
react-native link realm
CocoaPods Installation
Please use the following command to install CocoaPods
cd ios && pod install && cd ..
Here we have done with our installation of the library. If you are still facing the trouble please comment below so that we can help you out from the problem.
Project Structure
We will perform complete CRUD operation in this example. Please create the following project structure and copy the code given below.
Code for Realm Database
Open the project directory and replace the following code
App.js
/*Example of RealM Database in React Native*/
import React from 'react';
//Import react-navigation
import { createAppContainer } from 'react-navigation';
import { createStackNavigator} from 'react-navigation-stack';
//Import external files
import HomeScreen from './pages/HomeScreen';
import RegisterUser from './pages/RegisterUser';
import UpdateUser from './pages/UpdateUser';
import ViewUser from './pages/ViewUser';
import ViewAllUser from './pages/ViewAllUser';
import DeleteUser from './pages/DeleteUser';
const App = createStackNavigator({
HomeScreen: {
screen: HomeScreen,
navigationOptions: {
title: 'HomeScreen',
headerStyle: { backgroundColor: '#3a59b7' },
headerTintColor: '#ffffff',
},
},
View: {
screen: ViewUser,
navigationOptions: {
title: 'View User',
headerStyle: { backgroundColor: '#3a59b7' },
headerTintColor: '#ffffff',
},
},
ViewAll: {
screen: ViewAllUser,
navigationOptions: {
title: 'View All User',
headerStyle: { backgroundColor: '#3a59b7' },
headerTintColor: '#ffffff',
},
},
Update: {
screen: UpdateUser,
navigationOptions: {
title: 'Update User',
headerStyle: { backgroundColor: '#3a59b7' },
headerTintColor: '#ffffff',
},
},
Register: {
screen: RegisterUser,
navigationOptions: {
title: 'Register User',
headerStyle: { backgroundColor: '#3a59b7' },
headerTintColor: '#ffffff',
},
},
Delete: {
screen: DeleteUser,
navigationOptions: {
title: 'Delete User',
headerStyle: { backgroundColor: '#3a59b7' },
headerTintColor: '#ffffff',
},
},
});
export default createAppContainer(App);
Mybutton.js
/*Custom Button*/
import React from 'react';
import { TouchableOpacity, Text, StyleSheet } from 'react-native';
const Mybutton = props => {
return (
<TouchableOpacity style={styles.button} onPress={props.customClick}>
<Text style={styles.text}>{props.title}</Text>
</TouchableOpacity>
);
};
const styles = StyleSheet.create({
button: {
alignItems: 'center',
backgroundColor: '#f05555',
color: '#ffffff',
padding: 10,
marginTop: 16,
marginLeft: 35,
marginRight: 35,
},
text: {
color: '#ffffff',
},
});
export default Mybutton;
Mytext.js
/*Custom Text*/
import React from 'react';
import { TouchableHighlight, Text, StyleSheet } from 'react-native';
const Mytext = props => {
return <Text style={styles.text}>{props.text}</Text>;
};
const styles = StyleSheet.create({
text: {
color: '#111825',
fontSize: 18,
marginTop: 16,
marginLeft: 35,
marginRight: 35,
},
});
export default Mytext;
Mytextinput.js
/*Custom TextInput*/
import React from 'react';
import { View, TextInput } from 'react-native';
const Mytextinput = props => {
return (
<View
style={{
marginLeft: 35,
marginRight: 35,
marginTop: 10,
borderColor: '#007FFF',
borderWidth: 1,
}}>
<TextInput
underlineColorAndroid="transparent"
placeholder={props.placeholder}
placeholderTextColor="#007FFF"
keyboardType={props.keyboardType}
onChangeText={props.onChangeText}
returnKeyType={props.returnKeyType}
numberOfLines={props.numberOfLines}
multiline={props.multiline}
onSubmitEditing={props.onSubmitEditing}
style={props.style}
blurOnSubmit={false}
value={props.value}
/>
</View>
);
};
export default Mytextinput;
HomeScreen.js
/*Home Screen With buttons to navigate to diffrent options*/
import React from 'react';
import { View } from 'react-native';
import Mybutton from './components/Mybutton';
import Mytext from './components/Mytext';
import Realm from 'realm';
let realm;
export default class HomeScreen extends React.Component {
constructor(props) {
super(props);
realm = new Realm({
path: 'UserDatabase.realm',
schema: [
{
name: 'user_details',
properties: {
user_id: { type: 'int', default: 0 },
user_name: 'string',
user_contact: 'string',
user_address: 'string',
},
},
],
});
}
render() {
return (
<View
style={{
flex: 1,
backgroundColor: 'white',
flexDirection: 'column',
}}>
<Mytext text="RealM Example" />
<Mybutton
title="Register"
customClick={() => this.props.navigation.navigate('Register')}
/>
<Mybutton
title="Update"
customClick={() => this.props.navigation.navigate('Update')}
/>
<Mybutton
title="View"
customClick={() => this.props.navigation.navigate('View')}
/>
<Mybutton
title="View All"
customClick={() => this.props.navigation.navigate('ViewAll')}
/>
<Mybutton
title="Delete"
customClick={() => this.props.navigation.navigate('Delete')}
/>
</View>
);
}
}
RegisterUser.js
/*Screen to register the user*/
import React from 'react';
import { View, ScrollView, KeyboardAvoidingView, Alert } from 'react-native';
import Mytextinput from './components/Mytextinput';
import Mybutton from './components/Mybutton';
import Realm from 'realm';
let realm;
export default class RegisterUser extends React.Component {
constructor(props) {
super(props);
this.state = {
user_name: '',
user_contact: '',
user_address: '',
};
realm = new Realm({ path: 'UserDatabase.realm' });
}
register_user = () => {
var that = this;
const { user_name } = this.state;
const { user_contact } = this.state;
const { user_address } = this.state;
if (user_name) {
if (user_contact) {
if (user_address) {
realm.write(() => {
var ID =
realm.objects('user_details').sorted('user_id', true).length > 0
? realm.objects('user_details').sorted('user_id', true)[0]
.user_id + 1
: 1;
realm.create('user_details', {
user_id: ID,
user_name: that.state.user_name,
user_contact: that.state.user_contact,
user_address: that.state.user_address,
});
Alert.alert(
'Success',
'You are registered successfully',
[
{
text: 'Ok',
onPress: () => that.props.navigation.navigate('HomeScreen'),
},
],
{ cancelable: false }
);
});
} else {
alert('Please fill Address');
}
} else {
alert('Please fill Contact Number');
}
} else {
alert('Please fill Name');
}
};
render() {
return (
<View style={{ backgroundColor: 'white', flex: 1 }}>
<ScrollView keyboardShouldPersistTaps="handled">
<KeyboardAvoidingView
behavior="padding"
style={{ flex: 1, justifyContent: 'space-between' }}>
<Mytextinput
placeholder="Enter Name"
onChangeText={user_name => this.setState({ user_name })}
/>
<Mytextinput
placeholder="Enter Contact No"
onChangeText={user_contact => this.setState({ user_contact })}
maxLength={10}
keyboardType="numeric"
/>
<Mytextinput
placeholder="Enter Address"
onChangeText={user_address => this.setState({ user_address })}
maxLength={225}
numberOfLines={5}
multiline={true}
style={{ textAlignVertical: 'top' }}
/>
<Mybutton
title="Submit"
customClick={this.register_user.bind(this)}
/>
</KeyboardAvoidingView>
</ScrollView>
</View>
);
}
}
UpdateUser.js
/*Screen to update the user*/
import React from 'react';
import {
View,
YellowBox,
ScrollView,
KeyboardAvoidingView,
Alert,
} from 'react-native';
import Mytextinput from './components/Mytextinput';
import Mybutton from './components/Mybutton';
import Realm from 'realm';
let realm;
export default class UpdateUser extends React.Component {
constructor(props) {
super(props);
realm = new Realm({ path: 'UserDatabase.realm' });
this.state = {
input_user_id: '',
user_name: '',
user_contact: '',
user_address: '',
};
}
searchUser = () => {
const { input_user_id } = this.state;
console.log(this.state.input_user_id);
var user_details = realm
.objects('user_details')
.filtered('user_id =' + input_user_id);
console.log(user_details);
if (user_details.length > 0) {
this.setState({
user_name: user_details[0].user_name,
});
this.setState({
user_contact: user_details[0].user_contact,
});
this.setState({
user_address: user_details[0].user_address,
});
} else {
alert('No user found');
this.setState({
user_name: '',
});
this.setState({
user_contact: '',
});
this.setState({
user_address: '',
});
}
};
updateUser = () => {
var that = this;
const { input_user_id } = this.state;
const { user_name } = this.state;
const { user_contact } = this.state;
const { user_address } = this.state;
if (input_user_id) {
if (user_name) {
if (user_contact) {
if (user_address) {
realm.write(() => {
var ID = this.state.input_user_id;
console.log('ID', ID);
var obj = realm
.objects('user_details')
.filtered('user_id =' + this.state.input_user_id);
console.log('obj', obj);
if (obj.length > 0) {
obj[0].user_name = this.state.user_name;
obj[0].user_contact = this.state.user_contact;
obj[0].user_address = this.state.user_address;
Alert.alert(
'Success',
'User updated successfully',
[
{
text: 'Ok',
onPress: () =>
that.props.navigation.navigate('HomeScreen'),
},
],
{ cancelable: false }
);
} else {
alert('User Updation Failed');
}
});
} else {
alert('Please fill Address');
}
} else {
alert('Please fill Contact Number');
}
} else {
alert('Please fill Name');
}
} else {
alert('Please fill User Id');
}
};
render() {
return (
<View style={{ backgroundColor: 'white', flex: 1 }}>
<ScrollView keyboardShouldPersistTaps="handled">
<KeyboardAvoidingView
behavior="padding"
style={{ flex: 1, justifyContent: 'space-between' }}>
<Mytextinput
placeholder="Enter User Id"
onChangeText={input_user_id => this.setState({ input_user_id })}
/>
<Mybutton
title="Search User"
customClick={this.searchUser.bind(this)}
/>
<Mytextinput
placeholder="Enter Name"
value={this.state.user_name}
onChangeText={user_name => this.setState({ user_name })}
/>
<Mytextinput
placeholder="Enter Contact No"
value={'' + this.state.user_contact}
onChangeText={user_contact => this.setState({ user_contact })}
maxLength={10}
keyboardType="numeric"
/>
<Mytextinput
value={this.state.user_address}
placeholder="Enter Address"
onChangeText={user_address => this.setState({ user_address })}
maxLength={225}
numberOfLines={5}
multiline={true}
style={{ textAlignVertical: 'top' }}
/>
<Mybutton
title="Update User"
customClick={this.updateUser.bind(this)}
/>
</KeyboardAvoidingView>
</ScrollView>
</View>
);
}
}
ViewAllUser.js
/*Screen to view all the user*/
import React from 'react';
import { FlatList, Text, View } from 'react-native';
import Realm from 'realm';
let realm;
export default class ViewAllUser extends React.Component {
constructor(props) {
super(props);
this.state = {
FlatListItems: [],
};
realm = new Realm({ path: 'UserDatabase.realm' });
var user_details = realm.objects('user_details');
this.state = {
FlatListItems: user_details,
};
}
ListViewItemSeparator = () => {
return (
<View style={{ height: 0.5, width: '100%', backgroundColor: '#000' }} />
);
};
render() {
return (
<View>
<FlatList
data={this.state.FlatListItems}
ItemSeparatorComponent={this.ListViewItemSeparator}
keyExtractor={(item, index) => index.toString()}
renderItem={({ item }) => (
<View style={{ backgroundColor: 'white', padding: 20 }}>
<Text>Id: {item.user_id}</Text>
<Text>Name: {item.user_name}</Text>
<Text>Contact: {item.user_contact}</Text>
<Text>Address: {item.user_address}</Text>
</View>
)}
/>
</View>
);
}
}
ViewUser.js
/*Screen to view single user*/
import React from 'react';
import { Text, View, Button } from 'react-native';
import Mytextinput from './components/Mytextinput';
import Mybutton from './components/Mybutton';
import Realm from 'realm';
let realm;
export default class ViewUser extends React.Component {
constructor(props) {
super(props);
realm = new Realm({ path: 'UserDatabase.realm' });
this.state = {
input_user_id: '',
userData: '',
};
}
searchUser = () => {
const { input_user_id } = this.state;
console.log(this.state.input_user_id);
var user_details = realm
.objects('user_details')
.filtered('user_id =' + input_user_id);
console.log(user_details);
if (user_details.length > 0) {
console.log(user_details[0]);
this.setState({
userData: user_details[0],
});
} else {
alert('No user found');
this.setState({
userData: '',
});
}
};
render() {
return (
<View>
<Mytextinput
placeholder="Enter User Id"
onChangeText={input_user_id => this.setState({ input_user_id })}
/>
<Mybutton
title="Search User"
customClick={this.searchUser.bind(this)}
/>
<View style={{ marginLeft: 35, marginRight: 35, marginTop: 10 }}>
<Text>User Id: {this.state.userData.user_id}</Text>
<Text>User Name: {this.state.userData.user_name}</Text>
<Text>User Contact: {this.state.userData.user_contact}</Text>
<Text>User Address: {this.state.userData.user_address}</Text>
</View>
</View>
);
}
}
DeleteUser.js
/*Screen to delete the user*/
import React from 'react';
import { Button, Text, View, Alert } from 'react-native';
import Mytextinput from './components/Mytextinput';
import Mybutton from './components/Mybutton';
import Realm from 'realm';
let realm;
export default class UpdateUser extends React.Component {
constructor(props) {
super(props);
realm = new Realm({ path: 'UserDatabase.realm' });
this.state = {
input_user_id: '',
};
}
deleteUser = () => {
var that = this;
const { input_user_id } = this.state;
realm.write(() => {
var ID = this.state.input_user_id;
if (
realm.objects('user_details').filtered('user_id =' + input_user_id)
.length > 0
) {
realm.delete(
realm.objects('user_details').filtered('user_id =' + input_user_id)
);
var user_details = realm.objects('user_details');
console.log(user_details);
Alert.alert(
'Success',
'User deleted successfully',
[
{
text: 'Ok',
onPress: () => that.props.navigation.navigate('HomeScreen'),
},
],
{ cancelable: false }
);
} else {
alert('Please insert a valid User Id');
}
});
};
render() {
return (
<View style={{ backgroundColor: 'white', flex: 1 }}>
<Mytextinput
placeholder="Enter User Id"
onChangeText={input_user_id => this.setState({ input_user_id })}
/>
<Mybutton
title="Delete User"
customClick={this.deleteUser.bind(this)}
/>
</View>
);
}
}
To Run the React Native App
Open the terminal again and jump into your project using.
cd ProjectName
1. Start Metro Bundler
First, you will need to start Metro, the JavaScript bundler that ships with React Native. To start Metro bundler run following command:
npx react-native start
Once you start Metro Bundler it will run forever on your terminal until you close it. Let Metro Bundler run in its own terminal. Open a new terminal and run the application.
2. Start React Native Application
To run the project on an Android Virtual Device or on real debugging device:
npx react-native run-android
or on the iOS Simulator by running (macOS only)
npx react-native run-ios
After running the Application successfully if you want to see the stored data in the device just to check whether database is storing the data proper you can visit How to See Realm Database Data Saved in Device using Android Studio.
Output Screenshots
This is how you can use Realm Database in React Native Application. If you have any doubts or you want to share something about the topic you can comment below or contact us here. There will be more posts coming soon. Stay tuned!
Hope you liked it. 🙂
Hi Snehal Agrawal,
Thank you so much for perfect example. Do you have any tutorial or example to send this offline saved realm data on live server MySQL database, or any Sync method ?
I don’t think it is a very good idea to map two different database type :p but still, if you want then you can take an additional flag with each of the data tables that are sync_flag and that will be zero whenever you create a local record or do an update in the record. So whenever you want to send the data to the server you can take the records with sunc_flag zero and send them to the server.
Hi Rizwan,
The most obvious is to use the built in sync mechanism for Realm. With just a url to the Realm Cloud instead of a local filename for the database, all data will sync realtime to all other devices that reference the same database. You can see more here: https://docs.realm.io/sync/.
Adding sync support could be a nice followup post 😉
(Full disclosure: I work at MongoDB on Realm)
Hi Brian,
Thank you very much for sharing such important information.
Hi
how can I delete all objects/users at once ?
Can you please try
realm.deleteAll();
Reference: https://realm.io/docs/swift/latest/#deleting-objects
😊 Awesome Tutorial 😊
Hi, thank you for the tutorial, how do i backup the database to google drive or any other thank you
You just need to create the backup file and then Store/Retrieve Files on Google Drive using React Native App will help you to upload it on Google Drive.
hi , thank you for the toturial, this very useful for me
Hi how to Load Pre Populated realm Database?
not able retrieve data from realm data base by following this code
data is not displayed in ViewUser and ViewAllUser page