Firebase Firestore Database for Android Application

No matter what kind of app you’re developing these days, there’s a good chance
you’ll want to store data in the cloud.Because your user wants to assess their data from more than one device.

Cloud Firestore lets you store your data in the cloud, so you can sync it across all your devices or share them with multiple users.It comes with all the conveniences you’d expect from a firebase product, like robust client libraries, full support for offline mode so your app will continue to work just fine whether you’re connected or not– even on the web– a comprehensive set of security rules to help you manage access and sleep at night and an easy-to-use data browsing tool.It also lets you structure your data in ways that make sense to you thanks to its powerful querying and fetching capabilities.

Cloud Firestore works in near real time, automatically fetching changes from your database as they happen, or you can request and fetch data manually.It’s completely up to you.

Firestore integrates with other Firebase products, including firebase Authentication for easy sign-in and Cloud Functions, which lets you run all sorts of server-side logic in response to changes in your database, all of which means you get a truly serverless development experience.That means you can spend less time on infrastructure issues and more time building your app.

Getting Started with Cloud Firestore on Android


So I’m working a little app here that lets me store a thought.

My App consists of an EditText view where I can enter my thought and then the second one here where I can enter the publisher’s name and  then I have Publish button where we’re gonna save whatever thought our user has entered into the cloud so later we’ll load whatever data our users saved to the cloud and display it with a big Listview or something

Enable Firestore in Firebase


In order access to Firestore you need to enable Firestore in Firebase Console.

Enable Firestore

Add Firebase to your Android project


Create a Firebase project in the firebase console and configure the Google services plug-in with JSON file.

Add Firebase to your Android project

 

Firestore is a Document Database


Let’s take a moment to understand how cloud Firestore generally works frankly this could be the subject of its own separate post and it probably will be one day but here is the executive summary.

Document Database Database
Firestore is a document database that means it kind of stores your data in a big tree like structure kind of like the original real-time database but everything is placed into documents and collections
Firestore Document
You can think of a document is something kind of like a map it’s got key-value pairs which is the Firestone folks like to refer to as fields and the values of these things can be any number of things from strings to numbers to binary values to little small maps that are kind of JSON looking objects.

Firestore Collection
The collection is basically well collections of documents so there are a few rules around the use of this thing.

Rule 1: Collections can only contain documents nothing else no collections of strings or binary or anything else.

Rule 2: Documents can’t contain other documents but they can point to sub collections so it’s very common to see a collection containing a bunch documents which then point to sub-collections that contain other documents and so on in a user workout app for instance.

Firestore Document Database Example

I might have a users collection and this collection would contain a document for each user and then each of those documents might point to a workout subcollection that in turn contains a document for each different type of workout that this user is performed and then maybe each one of these has a history sub-collection that keeps track of every time the user performed one of these workouts may be along with like some average heart rate data or some other stuff like that.

If you’re coming from real-time database land this kind of deep nesting might be giving you heart palpitations but don’t worry this kind of data structure is completely normal in the cloud Firestore world where queries are shallow meaning that when you grab data from a document you’ll garb just that document not any of the documents contained in any of the sub-collections below which nice.

Rule 3: The root of your database can only consist of the collection now in a normal production app this is going to feel pretty natural.
Firestore Rule #3

When you’re creating a little test app like ours and you just want to save like two string so looking at app at the top level I’m gonna starting with a collection that I’m calling “lifethought ” this will then contain one single document called “publicThought” this document will contain subcollections and this subcollection contain individual call “thought”  which is identified by unique id.

Add Firestore Dependency to your app


Let’s start building so first thing you need to make sure you have Firestore installed and so you’ll go into your app.gradle file and add Firestore to your project.

We’re good, so next in my main activity here I’m gonna head on down to my publishThought call.

Cloud Firestore also supports writing your own Java objects with custom classes. Cloud Firestore will internally convert the objects to supported data types.Each custom class must have a public constructor that takes no arguments. In addition, the class must include a public getter for each property.

Now you just need to save this to the cloud and to do that you need to specify in which document you want to put this data so you do that through an object known as a DocumentReference let’s initialized it up.

I pass along a slash-separated string as our path so in our case, the path would be “thought/lifeThought

Just remember that in your path you’re always going to be alternating between collections documents collection document and so on.Firestore Database Path

so now that I’ve specified my document. In my publishThought() method where I’m going to call set on the document reference and that will take in the data. I created above as the contents of my document this call will replace my current document if it exists and created if it doesn’t it also conveniently create the sample data collection too so I don’t need to worry about that not existing now I’m going to chain on an addOnSuccessListener like so where we can print a debug message. And then we can add an addOnFailureListener listener where we can print out any error messages.

For those of you who are all about fewer listener in your call, you could also handle this with a single OnCompleteListener like and then just check in here to see if your task is successful either way works and honestly it’s just really up to you which method you prefer.

Error on Document Writing com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: Missing or insufficient permissions.

Just like the real-time database cloud, Firestore implementation contains a set of security rules that determine whether or not a certain action will be permitted.By default they’re set up that nobody can read or write to the database.I’m willing to share with each particular user.So I’m just going to do a bit a hack here and make my sample data documents open to the public.

Set Firestore rules

I’ll select my project go to database selection and then make sure I select cloud Firestore for my list of database options then I will click the rules tab and then I’m going to add these lines here to allows reading and writing to anything that’s part of my sample data collection now this a pretty terrible idea from a security perspective but at least I’ve contained the damage to just what’s in my sample data collection so I’ll publish that and we are done.

So I’m going to start up my app, and I am going to enter thought in the text field and I hit publish button.

Firestore Database on android

I can verify this by going back to the Firebase console we’ll select the data tab and then I can look at our data collection find our document and sure enough look likes we’ve saved our inspiring thought to the world.

Firebase Cloud Firestore Database

Get Data with Cloud Firestore


We need to show our users this inspirational thought by grabbing that data from the cloud and populating in some kind of list view with it now like the real-time database cloud Firestore lets me listen to changes in the database and update my app in real time.

So let’s create a Thought List  I’m  gonna add a Recyclerview in the middle of my screen that has a TextView where I can display the thought and publisher name.

I already have my document reference.

Perform Simple Query in Cloud Firestore


Cloud Firestore provides powerful query functionality for specifying which documents you want to retrieve from a collection. These queries can also be used with either get() or addSnapshotListener().

Get Realtime Updates with Cloud Firestore


You can listen to a document with the onSnapshot() method. An initial call using the callback you provide creates a document snapshot immediately with the current contents of the single document. Then, each time the contents change, another call updates the document snapshot.

When I publish thought now my callback is getting called twice once for the change in my local cache and then once on the server.This is because of an important feature called latency compensation.

Download this project from GitHub

 

Related Post

Firestore Document Database Data Model.
Firestore Security With Firebase Authentication

Leave a Reply

Your email address will not be published. Required fields are marked *