Tuning Your SQLite With SQLDelight & SQLBrite: Part 2
In a previous post we considered how we can make our database observable and how to get Rx support. Today we’ll talk about SQLDelight.
SQLDelight is a Gradle plugin that generates Java models from your SQL CREATE TABLE
statements. These models provide you with a typesafe API able to read & write the rows of your tables. It helps you keep your SQL statements together, organized, and easy to access from Java.
Setup
To use SQLDelight, put your SQL statements in a .sq
file, such as src/main/sqldelight/com/example/Images.sq
From this, SQLDelight will generate an ImagesModel
Java interface with nested classes for reading and writing the database. Then you only need to implement this Java interface. Using Google’s AutoValue you can minimally make implementations of the model:
The Factory
, nested class of ImagesModel
, is responsible for mapper and query creation. To create the factory you need to implement the Create
interface, which is responsible for creation of Java model.
Notice, that each of statements will have an interface and mapper generated for it, as well as a method in the factory for creating a new instance of the mapper.
As you can see, there are no getColumnIndex
method calls. The plugin requires that you specify the table’s in .sq
files and plugin generate column IDs in the order you specify automatically. It gives you a 20%, or so, increase in query time as compared to calling the getColumnIndex
, which is a huge benefit.
Insert example
SQLDelight generates a typesafe class for any statements which should be compiled.
Let’s consider the bind
method. SQLDelight use the SQLiteProgram
class for arguments binding, not ContentValues
. This solution is much better than ContentValues
. ContentValues
API it’s just a wrapper for the same things. So, in this case, it’s just an unnecessary overhead.
In java code
Example of query
generate this class
In java code
Sets of values also can be passed as an argument
In java you have typesafe method arguments you need
Query with join
The plugin will generate the Java model interface for this join.
Then you need implement this interface like ImagesModel
.
Support imports like Java in .sq files
You can use java class as a table field type. For example, create_time
field saved in a table as an integer, but when you do a query or insertion in java code you need to pass a Calendar
. For the magic to happen, you need to create ColumnAdapter
and pass it to Factory constructor.
And for the last one, here's an example of usage SQLBrite and SQLDelight:
Intellij IDEA plugin features:
- Syntax highlighting
- Refactoring/Find usages
- Code autocompletion
- Generate Model files after edits
- Right click to copy as valid SQLite
- Compiler errors in IDE click through to file
Conclusion
So, with SQLBrite and SQLDelight we have support for RxJava, Type Safety, Compiler Errors and we still have all-the SQLite features. Also, with AutoValue we have immutability and easier model implementation.
Other benefits:
- Shared language (SQL)
- Tight coupling with views (MVVM)
- Easier code review
- Confidence writing SQL