In this blog post, you will learn how to use Firebase Realtime Database with CRUD Operations in Xamarin.Forms.
Introduction
Xamarin.Forms code runs on multiple platforms - each of which has its own filesystem. This means that reading and writing files is most easily done using the native file APIs on each platform. Alternatively, embedded resources are a simpler solution to distribute data files with an app.
Firebase
Firebase gives you functionality like analytics, databases, messaging and crash reporting so you can move quickly and focus on your users.
Firebase is a backend platform for building Web, Android, and iOS applications. It offers real-time database, different APIs, multiple authentication types and hosting platform. This is an introductory tutorial, which covers the basics of the Firebase platform and explains how to deal with its various components and sub-components.
Build apps with Firebase
- Real-time Database
- Storage
- Notifications
- Authentication
- Hosting
- Visual Studio 2017 or Later(Windows or Mac)
Start by creating a new Xamarin.Forms project. You’ll learn more by going through the steps yourself.or download source here
https://github.com/susairajs/Xamarin-Firebase-RealtimeDatabase
Visual Studio 2019 has more options in the opening window. Clone or check out the code from any repository or, open a project or solution for your computer.
Now, you need to click "Create a new project".
Now, filter by Project Type: Mobile
Choose the Mobile App (Xamarin. forms) project under C# and Mobile.
Name your app. You probably want your project and solution to use the same name as your app. Put it on your preferred location for projects and click "Create".
Now, select the blank app and target platforms - Android, iOS and Windows (UWP).
Subsequently, go to the solution. In there, you get all the files and sources of your project (.NET Standard). Now, select XAML page and double-click to open the MainPage.Xaml page.
You now have a basic Xamarin.Forms app. Click the Play button to try it out.
Create a project in Firebase
In this step, create a project in Firebase. Go to the following link.
https://console.firebase.google.com/
Click "Add Project".
Now, your project is ready, click continue.
In this step Choose Database under the Project Overview. Now click to Create the database.
In this step, give read and write rules.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
/* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */ | |
"rules": { | |
".read": "auth==null", | |
".write":"auth==null" | |
} | |
} |
Now, your Firebase Realtime Database ready. you can use your database api uri here.
Setting up the User Interface
Go to MainPage.Xaml and write the following code.
MainPage.xaml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="utf-8" ?> | |
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" | |
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" | |
xmlns:local="clr-namespace:XamarinFirebase" | |
x:Class="XamarinFirebase.MainPage"> | |
<StackLayout> | |
<StackLayout> | |
<StackLayout HorizontalOptions="Center" VerticalOptions="Start"> | |
<Image x:Name="imgBanner" Source="banner.png" ></Image> | |
<Image Margin="0,0,0,10" HeightRequest="100" Source="firebase.png" ></Image> | |
<Label Margin="0,0,0,10" Text="Firebase Realtime Database" FontAttributes="Bold" FontSize="Large" TextColor="Gray" HorizontalTextAlignment="Center" ></Label> | |
<Entry x:Name="txtId" Placeholder="ID"></Entry> | |
<Entry x:Name="txtName" Placeholder="Enter Name"></Entry> | |
<StackLayout HorizontalOptions="CenterAndExpand" Orientation="Horizontal"> | |
<Button x:Name="btnAdd" WidthRequest="200" Text="Add" Clicked="BtnAdd_Clicked"/> | |
<Button x:Name="btnRetrive" WidthRequest="200" Text="Retrive" Clicked="BtnRetrive_Clicked"/> | |
</StackLayout> | |
<StackLayout HorizontalOptions="CenterAndExpand" Orientation="Horizontal"> | |
<Button x:Name="btnUpdate" WidthRequest="200" Text="Update" Clicked="BtnUpdate_Clicked" /> | |
<Button x:Name="btnDelete" WidthRequest="200" Text="Delete" Clicked="BtnDelete_Clicked" /> | |
</StackLayout> | |
<ListView x:Name="lstPersons"> | |
<ListView.ItemTemplate> | |
<DataTemplate> | |
<TextCell Text="{Binding Name}"></TextCell> | |
</DataTemplate> | |
</ListView.ItemTemplate> | |
</ListView> | |
</StackLayout> | |
</StackLayout> | |
</StackLayout> | |
</ContentPage> |
NuGet Packages
Now, add the following NuGet Packages.
- FirebaseDatabase.net
Go to Solution Explorer and select your solution. Right-click and select "Manage NuGet Packages for Solution". Search "FirebaseDatabase.net" and add Package. Remember to install it for each project (.NET Standard, Android, iO, and UWP).
Create a Model
In this step, you can create a model for deserializing your response.
Person.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
namespace XamarinFirebase.Model | |
{ | |
public class Person | |
{ | |
public int PersonId { get; set; } | |
public string Name { get; set; } | |
} | |
} |
Now, Write the following code Connect your Firebase Realtime Database
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using Firebase.Database; | |
using Firebase.Database.Query; | |
FirebaseClient firebase = new FirebaseClient("https://xamarinfirebase-xxxxx.firebaseio.com/"); |
Now, write the code to read all data from Firebase Realtime Database.
FirebaseHelper.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public async Task<List<Person>> GetAllPersons() | |
{ | |
return (await firebase | |
.Child("Persons") | |
.OnceAsync<Person>()).Select(item => new Person | |
{ | |
Name = item.Object.Name, | |
PersonId = item.Object.PersonId | |
}).ToList(); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
FirebaseHelper firebaseHelper = new FirebaseHelper(); | |
public MainPage() | |
{ | |
InitializeComponent(); | |
} | |
protected async override void OnAppearing() | |
{ | |
base.OnAppearing(); | |
var allPersons = await firebaseHelper.GetAllPersons(); | |
lstPersons.ItemsSource = allPersons; | |
} |
Insert
Now, write the following code to insert data into Firebase Realtime Database.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public async Task AddPerson(int personId,string name) | |
{ | |
await firebase | |
.Child("Persons") | |
.PostAsync(new Person() { PersonId=personId, Name = name }); | |
} | |
private async void BtnAdd_Clicked(object sender, EventArgs e) | |
{ | |
await firebaseHelper.AddPerson(Convert.ToInt32(txtId.Text), txtName.Text); | |
txtId.Text = string.Empty; | |
txtName.Text = string.Empty; | |
await DisplayAlert("Success", "Person Added Successfully", "OK"); | |
var allPersons = await firebaseHelper.GetAllPersons(); | |
lstPersons.ItemsSource = allPersons; | |
} |
Read
Now, write the following code to read data from Firebase Realtime Database.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public async Task<Person> GetPerson(int personId) | |
{ | |
var allPersons = await GetAllPersons(); | |
await firebase | |
.Child("Persons") | |
.OnceAsync<Person>(); | |
return allPersons.Where(a => a.PersonId == personId).FirstOrDefault(); | |
} | |
private async void BtnRetrive_Clicked(object sender, EventArgs e) | |
{ | |
var person = await firebaseHelper.GetPerson(Convert.ToInt32(txtId.Text)); | |
if(person!=null) | |
{ | |
txtId.Text = person.PersonId.ToString(); | |
txtName.Text = person.Name; | |
await DisplayAlert("Success", "Person Retrive Successfully", "OK"); | |
} | |
else | |
{ | |
await DisplayAlert("Success", "No Person Available", "OK"); | |
} | |
} |
Update
Now, write the following code to update data to Firebase Realtime Database.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public async Task UpdatePerson(int personId, string name) | |
{ | |
var toUpdatePerson = (await firebase | |
.Child("Persons") | |
.OnceAsync<Person>()).Where(a => a.Object.PersonId == personId).FirstOrDefault(); | |
await firebase | |
.Child("Persons") | |
.Child(toUpdatePerson.Key) | |
.PutAsync(new Person() { PersonId = personId, Name = name }); | |
} | |
private async void BtnUpdate_Clicked(object sender, EventArgs e) | |
{ | |
await firebaseHelper.UpdatePerson(Convert.ToInt32(txtId.Text), txtName.Text); | |
txtId.Text = string.Empty; | |
txtName.Text = string.Empty; | |
await DisplayAlert("Success", "Person Updated Successfully", "OK"); | |
var allPersons = await firebaseHelper.GetAllPersons(); | |
lstPersons.ItemsSource = allPersons; | |
} |
Delete
Now, write the following code to delete data from Firebase Realtime Database.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public async Task DeletePerson(int personId) | |
{ | |
var toDeletePerson = (await firebase | |
.Child("Persons") | |
.OnceAsync<Person>()).Where(a => a.Object.PersonId == personId).FirstOrDefault(); | |
await firebase.Child("Persons").Child(toDeletePerson.Key).DeleteAsync(); | |
} | |
private async void BtnDelete_Clicked(object sender, EventArgs e) | |
{ | |
await firebaseHelper.DeletePerson(Convert.ToInt32(txtId.Text)); | |
await DisplayAlert("Success", "Person Deleted Successfully", "OK"); | |
var allPersons = await firebaseHelper.GetAllPersons(); | |
lstPersons.ItemsSource = allPersons; | |
} |
Full code
FirebaseHelper.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using XamarinFirebase.Model; | |
using Firebase.Database; | |
using Firebase.Database.Query; | |
using System.Linq; | |
using System.Threading.Tasks; | |
using Newtonsoft.Json; | |
namespace XamarinFirebase.Helper | |
{ | |
public class FirebaseHelper | |
{ | |
FirebaseClient firebase = new FirebaseClient("https://xamarinfirebase-909d2.firebaseio.com/"); | |
public async Task<List<Person>> GetAllPersons() | |
{ | |
return (await firebase | |
.Child("Persons") | |
.OnceAsync<Person>()).Select(item => new Person | |
{ | |
Name = item.Object.Name, | |
PersonId = item.Object.PersonId | |
}).ToList(); | |
} | |
public async Task AddPerson(int personId,string name) | |
{ | |
await firebase | |
.Child("Persons") | |
.PostAsync(new Person() { PersonId=personId, Name = name }); | |
} | |
public async Task<Person> GetPerson(int personId) | |
{ | |
var allPersons = await GetAllPersons(); | |
await firebase | |
.Child("Persons") | |
.OnceAsync<Person>(); | |
return allPersons.Where(a => a.PersonId == personId).FirstOrDefault(); | |
} | |
public async Task UpdatePerson(int personId, string name) | |
{ | |
var toUpdatePerson = (await firebase | |
.Child("Persons") | |
.OnceAsync<Person>()).Where(a => a.Object.PersonId == personId).FirstOrDefault(); | |
await firebase | |
.Child("Persons") | |
.Child(toUpdatePerson.Key) | |
.PutAsync(new Person() { PersonId = personId, Name = name }); | |
} | |
public async Task DeletePerson(int personId) | |
{ | |
var toDeletePerson = (await firebase | |
.Child("Persons") | |
.OnceAsync<Person>()).Where(a => a.Object.PersonId == personId).FirstOrDefault(); | |
await firebase.Child("Persons").Child(toDeletePerson.Key).DeleteAsync(); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using XamarinFirebase.Helper; | |
using XamarinFirebase.Model; | |
namespace XamarinFirebase | |
{ | |
public partial class MainPage : ContentPage | |
{ | |
FirebaseHelper firebaseHelper = new FirebaseHelper(); | |
public MainPage() | |
{ | |
InitializeComponent(); | |
} | |
protected async override void OnAppearing() | |
{ | |
base.OnAppearing(); | |
var allPersons = await firebaseHelper.GetAllPersons(); | |
lstPersons.ItemsSource = allPersons; | |
} | |
private async void BtnAdd_Clicked(object sender, EventArgs e) | |
{ | |
await firebaseHelper.AddPerson(Convert.ToInt32(txtId.Text), txtName.Text); | |
txtId.Text = string.Empty; | |
txtName.Text = string.Empty; | |
await DisplayAlert("Success", "Person Added Successfully", "OK"); | |
var allPersons = await firebaseHelper.GetAllPersons(); | |
lstPersons.ItemsSource = allPersons; | |
} | |
private async void BtnRetrive_Clicked(object sender, EventArgs e) | |
{ | |
var person = await firebaseHelper.GetPerson(Convert.ToInt32(txtId.Text)); | |
if(person!=null) | |
{ | |
txtId.Text = person.PersonId.ToString(); | |
txtName.Text = person.Name; | |
await DisplayAlert("Success", "Person Retrive Successfully", "OK"); | |
} | |
else | |
{ | |
await DisplayAlert("Success", "No Person Available", "OK"); | |
} | |
} | |
private async void BtnUpdate_Clicked(object sender, EventArgs e) | |
{ | |
await firebaseHelper.UpdatePerson(Convert.ToInt32(txtId.Text), txtName.Text); | |
txtId.Text = string.Empty; | |
txtName.Text = string.Empty; | |
await DisplayAlert("Success", "Person Updated Successfully", "OK"); | |
var allPersons = await firebaseHelper.GetAllPersons(); | |
lstPersons.ItemsSource = allPersons; | |
} | |
private async void BtnDelete_Clicked(object sender, EventArgs e) | |
{ | |
await firebaseHelper.DeletePerson(Convert.ToInt32(txtId.Text)); | |
await DisplayAlert("Success", "Person Deleted Successfully", "OK"); | |
var allPersons = await firebaseHelper.GetAllPersons(); | |
lstPersons.ItemsSource = allPersons; | |
} | |
} | |
} |
Happy Coding :)
Nice post and more informative,thanks for sharing.
ReplyDeleteinformatica mdm training
Informatica MDM Training in Chennai
Informatica Training Institute in Chennai
ionic course in chennai
IoT courses in Chennai
Data Analytics Courses in Chennai
Blockchain Training in Chennai
i get this exception:
ReplyDeleteFirebase.Database.FirebaseException
Message=Exception occured while processing the request.
what should i do?
Do I need to add "persons" in my db before i run this? When I click on add, it just freezes, I copied the code exactly (changing the client path of course)
ReplyDeleteTurns out it was because of the EMULATOR. On a physical device works perfectly
DeleteThanks for sharing this informative content , Great work
ReplyDeleteLeanpitch provides online training in Scrum Master during this lockdown period everyone can use it wisely.
CSM Certification online
Would you have an example of how to publish a website using xamarin.forms?
ReplyDeleteThanks for sharing this informative content , Great work
ReplyDeleteLeanpitch provides online training in Advanced Scrum Master during this lockdown period everyone can use it wisely.
Advanced CSM training online
thanks Great Work ,Thanks a lot
ReplyDeleteWhen you use a genuine service, you will be able to provide instructions, share materials and choose the formatting style. Download macOS Catalina ISO
ReplyDeleteThanks for sharing this informative content , Great work Valentine week 2021
ReplyDeleteI wish to show thanks to you just for bailing me out of this particular trouble. As a result of checking through the net and meeting techniques that were not productive, Same as your blog I found another one Inbounce Marketing .Actually I was looking for the same information on internet for Inbounce Marketing and came across your blog. I am impressed by the information that you have on this blog. Thanks once more for all the details.
ReplyDeleteNice blog! I really loved reading through this Blog... Thanks for sharing such a very interesting post with us and keep blogging. Visit our website-
ReplyDeleteXamarin App Developers
web and App Development company
ABP .io Development company
can you please create a project to get live location tracking with firebase
ReplyDeleteplease , very urgent
ReplyDelete