Navigating Offline Waters

Navigating Offline Waters


3 min read

Hey there! Today, I'm diving into a topic that's crucial for many modern apps: offline mode. Picture this: you're in a remote area with a spotty internet connection, yet you still want your app to work and allow your users to play with it and modify the local content but still be able to sync with the cloud when the internet connection is back. How do you pull it off and how to handle the conflict?

First things first, I am assuming that you have already implemented a robust local database to store your app's data. And for this, I usually go with Room. And please don't get me wrong, I used to use SQLite years ago but the drawback was all the boilerplate and code maintenance on every release. Room is an SQLite object mapping library that provides an abstraction layer over raw SQLite, making database operations a breeze.

So, for my Journey app, this is how my notes table looks

Now comes the tricky part:

The user will modify some notes while offline. Yet, it is our responsibility that those changes are not lost and that later, our app can complete the syncing of our local database with a remote server when the internet is back online. There are several strategies for this, but let's focus on a simple one: periodic synchronization.

For this, I am using a Worker who will be checking if the app has an internet connection. If that is the case, then I first request my database for all the notes that were modified. To do so, my journey_notes table has a property isSynced which I can use to tell if the note has been updated or not against the cloud.

Now, whenever I need to notify my db that a note is synced, I just call:

And when I need to get the list of modified notes or not synced notes, I call:

Cool. The next part is to define the implementation of syncing the local modified data with the cloud.

For simplicity of this post, I am going to show the implementation of updateNoteOnCloud on a single class but I would delegate the network call responsibility to a remoteDataSource, and based on the response, it would be up to the Repository to call the proper method on the localDataSource to access the database.

As you can see, In case of an error response from the server (e.g., due to a conflict), the handleConflict method is called to handle conflict resolution. You can implement your conflict resolution strategy here, such as comparing the local and cloud versions of the note and deciding which changes to keep. This could involve merging changes, prompting the user for resolution, or implementing a predefined conflict resolution policy.

And there you have it, folks! A sneak peek into my journey of implementing offline mode in Android apps using Room and data synchronization strategies. Remember, offline support isn't just a feature; it's a necessity in today's connected world.

I hope you found this guide helpful and that it inspires you to tackle offline mode in your projects. Until next time, happy coding! ๐Ÿš€