Welcome to our Flutter CRUD tutorial, where we will guide you through building data-driven applications using the powerful Drift package. In this tutorial, you’ll learn how to harness the capabilities of Flutter and leverage the Drift package to perform Create, Read, Update, and Delete (CRUD) operations seamlessly.
We’ll start by introducing the concept of CRUD operations and their significance in app development. Then, we’ll walk you through setting up the development environment and integrating the Drift package into your Flutter project. You’ll gain insights into defining data models, creating database tables, and establishing connections for efficient data storage.
With the foundation in place, we’ll delve into performing CRUD operations, showing you how to insert, retrieve, update, and delete data effortlessly. We’ll also explore advanced topics such as querying and filtering data to extract the information you need.
By the end of this tutorial, you’ll have the skills and knowledge to build robust and data-centric Flutter applications using the Drift package. Let’s get started on your journey to becoming a proficient Flutter developer!
Mobile Applications Data Management
In today’s digital age, data management plays a crucial role in the success of mobile applications. Mobile apps generate and process vast amounts of data, ranging from user profiles and preferences to transactional information and content. Effective data management ensures the accuracy, reliability, and security of this valuable information, enabling seamless user experiences and robust functionality.
By implementing robust data management practices, mobile applications can optimize performance, enhance user engagement, and provide personalized experiences. From organizing and storing data to retrieving and manipulating it efficiently, a well-designed data management system forms the backbone of a high-performing and user-centric mobile application. As we delve into integrating a drift database in Flutter, we will explore how this technology empowers developers to handle data effectively, enabling powerful and data-driven mobile applications.
Drift in Flutter: Understanding the Basics
Drift Package in Flutter
Using a drift database in Flutter development offers several advantages that greatly enhance the efficiency and functionality of mobile applications. Firstly, drift databases enable seamless offline data storage and synchronization. By providing local storage capabilities, apps can continue to function even without an internet connection, ensuring a smooth user experience and uninterrupted access to critical data.
Additionally, drift databases simplify data manipulation operations such as inserting, retrieving, updating, and deleting data. With their intuitive APIs and query languages, developers can efficiently interact with the database, reducing development time and effort. Moreover, drift databases offer robust data security and consistency mechanisms, ensuring that sensitive user information is protected and maintained accurately.
Furthermore, the ability to perform complex data queries and filtering operations empowers developers to deliver personalized and targeted content to users. Overall, integrating a drift database in Flutter development streamlines data management enhances app performance, and facilitates the creation of robust, responsive, and data-driven mobile applications.
Guide on integrating a Drift database in a Flutter application
The purpose of this blog post is to provide a comprehensive guide on integrating a drift database in a Flutter application. The blog aims to equip Flutter developers with the knowledge and skills necessary to effectively manage data in their mobile applications. It covers the entire process, from setting up the development environment and creating a drift database to performing CRUD operations, data querying, synchronization, error handling, and more.
By the end of the blog post, readers should have a clear understanding of how to leverage the power of drift databases to build robust and data-driven Flutter applications. The scope of the blog post includes step-by-step explanations, code examples, and best practices to guide readers through the implementation of key concepts related to drift database integration in Flutter.
We have different DBMS like Sqflite, Hive, Drift, etc. Some are SQL-based, and some are NoSQL-based. Each of them has its pros and cons, but I don’t want to talk about them here.
Understanding Drift Databases:
Drift databases are a powerful tool in mobile app development that enables seamless data management. These databases offer numerous benefits, including offline data storage and efficient data manipulation. With drift databases, developers can ensure data persistence even when the app is offline, allowing users to access and interact with their data without an internet connection.
The databases also provide intuitive APIs and query languages for easy data manipulation, simplifying the process of inserting, retrieving, updating, and deleting data. Additionally, drift databases offer robust data security and consistency mechanisms, ensuring that sensitive user information is protected and maintained accurately.
These databases empower developers to create responsive and data-driven mobile applications by enabling complex data querying and filtering operations. Whether it’s handling user profiles, transactional data, or content management, drift databases provide a reliable and scalable solution for effective data management in mobile app development.
Flutter Drift Package Step-to-Step Implementation Guide
The Drift Package is used in both Dart and Flutter applications and supports all platforms. Developers can write queries in Dart or SQL.
The best part of this package is its well-organized documentation which anyone can understand.
Adding The Dependencies
Add the following to your pubspec.yaml
:
How to define a Table using drift
You may wonder if all these packages are necessary. Each of them has its own use. As I said, the Drift package is our core package. Drift is built on SQLite and sqlite3_flutter_libs helps to develop Android or iOS apps. If you don’t create a Flutter app, you may not use it (at your own risk). All local databases are stored somewhere on the device, so you need a place to store the data, where the path and path_provider packages help the developer. Finally, drift_devand is used to generate the code build_runnera.
Flutter CRUD Tutorial
After installing Drift package, it’s time to put the tables into action. I have used the drift package in one of my projects and now I want to share my experience with you. Here are Category and note tables:


Depending on the table field, IntColumn, TextColumn, BoolColumn, DateTimeColumn and RealColumn can be used. If you want to set a default value for a column, you can use the withDefault function and pass it a value. The named functions are used when you want to set a different name for a field from its getter name. I think it goes without saying, so let’s talk about primary keys and foreign keys.
To specify primary keys one way is to override primaryKey getter and introduce considered columns. There is a reference method in drift to express foreign key(s) in your table (like categoryId in Note table).
This method has 2 optional parameters to describe Referential Actions (onDelete
and onUpdate
). Be aware that, in sqlite3, you must enable foreign key references. They need to be enabled with PRAGMA foreign_keys = ON
. I will show you soon.
After designing tables, we need a class to manage our database and write queries. Inside @DrfitDatabase
annotation, we should introduce the tables and views (if we have them) that we defined before. If we want to make special configurations when the database is being created or upgraded, we can override the migration
method. This function returns a MigrationStrategy
that receives 3 functions as input; onCreate
, onUpgrade
and beforeOpen
.

Don’t forget to run the below command to generate database.g.dart
file:
flutter pub run build_runner build
After this command is executed successfully, we have 2 versions for each of our tables; the Data version and the Companion version (for e.g NoteData
and NoteCompanion
).
Now I want to write queries. As you know we have 4 kinds of operations: insert
, update
, delete
and select
. In addition, we have where
clause, join
clause, etc. All of these can be done easily with some methods. In the following, I wrote a small example for each of them.
- The following code adds a category to the Category table. It’s simple, you just have to be careful that the
insert
function receives aCategoryCompanion
object.

2. Updating a record is as easy as A, B, and C. Drift package itself considers the places where the PKs are equal and performs the update. Unlike the insert function, this function receives the CategoryData
version.

3. The next thing is about deleting a record from a table. You know, to delete a record, we need a condition that we don’t delete all the records by mistake. One of the places where the where function can stand out is exactly here to specify omissions.

4. And finally it’s time to select. The query you see in the figure below is for searching between notes. In addition, I joined the two tables as needed in my project; There are also other types of joins in drift.

An important point is that when you join two tables together, the output of your query is none of the previous two tables, in such a situation, Drift will return you a list of TypedResults
, and you have to parse the data. These events do not necessarily happen during joining tables; You may decide to add a column to your output (for example, due to the use of Aggregation functions or something else) in a query. Here too, the result needs to be parsed.

Flutter Read JSON File from Assets: A Comprehensive Guide [2023]
Flutter, Google’s open-source UI software development kit, has gained immense popularity among developers for creating cross-platform mobile applications. One of the essential tasks in app development is reading data from external sources, such as JSON files. JSON (JavaScript Object Notation) is a lightweight data-interchange format that is easy for both humans and machines to read…
How to Decode JSON in Flutter: Ultimate Guide! [2023]
In modern app development, exchanging data between the front end and back end is a common requirement. JSON (JavaScript Object Notation) has become the de facto standard for data serialization due to its simplicity and wide support. Flutter, being a popular cross-platform mobile application framework, provides powerful tools to encode and decode objects to JSON…
The Best Database for Flutter: A Comprehensive Guide [2023]
Flutter is a popular mobile app development framework that is known for its flexibility and ease of use. However, choosing the right database for your Flutter app can be a daunting task. There are many different databases available, each with its own strengths and weaknesses. In this article, we will explore the best database for…