Visit GitHub Repo

NOTE: Because of the GREAT addition of Android Room (https://developer.android.com/topic/libraries/architecture/room), I'm deprecating this project. I have also created a conversion from DBTools to Room by using the dbtools-gen type: ANDROID-KOTLIN-ROOM (this will generate Room Entities and Daos from the DBTools schema.xml file). Also, there is a new dbtools-room project that is an library that makes it even easier to work with Google Room Library and SQLite Databases. (https://github.com/jeffdcamp/dbtools-room)

DBTools for Android

DBTools for Android is an Android ORM library that makes it easy to work with SQLite Databases.

Maven Central


  • Clean layout of of domain classes, domain manager classes, database definitions
  • Mature/Stable library: Used in many apps for years, and large apps with millions of users
  • Fast: Benchmark as one of the fastest ORMs for both reading and writing small, medium, and large sets of data
  • Code generator generates all of the boiler plate code.
  • Table change listeners (Listeners, Rx, LiveData), to know when changes happen to specific tables
  • First class testing support: All JUnit tests can run against JDBC Sqlite in the JVM
  • Rx support: Full support for Rx java Observables
  • Android Architecture Components LiveData and Paging support
  • Injection/Dagger support
  • Kotlin support: Generator can generate Kotlin and KotlinRx classes
  • Support Android Sqlite, sqlite.org sqlite, SQLCipher
  • SQLBuilder library to simplify building of SQL queries
  • Multiple database support: Easily work with many databases at the same time, and even merge databases


The following are some examples DBTools can be used:

  • Insert

    Individual individual = new Individual();
    individual.setName("Jeff Campbell");
  • Update

    Individual individual = individualManager.findByRowId(1);
  • Delete

    // Delete using record object
    Individual individual = individualManager.findByRowId(1);
    // Delete using the primary key id      
    // Delete all individuals who has "555" in their phone number
    individualManager.delete(IndividualConst.C_PHONE + " LIKE ?, new String[]{"555"}); 
  • Transactions

    // Start transaction (all record managers share transactions)
    boolean success = true;
    // End transaction.  (if success false, transaction is reverted)

DBTools Manager classes have many built-in methods that make working with tables even easier. Here is a few examples:

  • Find records

    // Individual Record by primary key
    Individual individual = individualManager.findByRowId(1);
    // Find FIRST individual who has "555" in their phone number
    Individual individual = individualManager.findBySelection(IndividualConst.C_PHONE + " LIKE ?", new String[]{"555"}); 
    // All Records
    List<Individual> allIndividuals = individualManager.findAll();
    // All Records, ordered by the "NAME" column
    List<Individual> allOrderedIndividuals = individualManager.findAllOrderBy(IndividualConst.C_NAME);
    // ALL Records who have "555" in their phone number
    List<Individual> specificIndividuals = individualManager.findAllBySelection(IndividualConst.C_PHONE + " LIKE ?, new String[]{"555"}); 
  • Using cursors

    // Find all, order by NAME column
    Cursor cursor = individualManager.findCursorBySelection(null, null, IndividualConst.C_NAME); 
    // Find cursor of those who have "555" in their phone number
    Cursor cursor = individualManager.findCursorBySelection(IndividualConst.C_PHONE + " LIKE ?, new String[]{"555"}); 
  • Access data from Cursor

    Cursor cursor;
    // populate all items from cursor into Individual
    Individual individual = new Individual(cursor); 
    // Get data from a single field, from a cursor.  (for use in places such as Adapters, etc) Examples:
    String name = Individual.getName(cursor);
    IndividualType type = Individual.getType(cursor);
    Date birthDate = Individual.getBirthDate(cursor);
  • Count number of items in the database

    // Find count of ALL records in a table
    int count = individualManager.findCount();
    // Find count of ALL records who have "555" in their phone number
    int count = individualManager.findCountBySelection(IndividualConst.C_PHONE + " LIKE ?, new String[]{"555"}); 

Table Change Listeners

  • Add Listener

    // Listener
    individualManager.addTableChangeListener(new DBToolsTableChangeListener() {
        public void onTableChange(DatabaseTableChange event) {


  • Setup

Tell DBTools to support RxJava:

   dbtools {
       rxJavaSupport true // support RxJava

Include the RxJava dependecy:

  // RxJava
  compile 'io.reactivex:rxandroid:<latest version>'
  compile 'io.reactivex:rxjava:<latest version>'
  • Usage


Use xxxRx(...) method calls on the manager classes to return an Observable

          .subscribe(individual -> Log.i(TAG, "Individual: " + individual.getFirstName()));

Subscribe to table changes (following example will output 2 table changes)

    public void changeNames() {
        // Subscribe to TABLE changes
        Subscription tableChangeSubscription = individualManager.tableChanges()
                .subscribe(changeType -> handleTableChange(changeType));
        // Make some changes
        Individual individual = individualManager.findAll().get(0);
        if (individual != null) {
            // change name
            // change name (again)
        // Unsubscribe
    public void handleTableChange(DatabaseTableChange change) {
        Log.e(TAG, "Individual Table Changed: [" + change.hasChange() + "]");


Maven Central

  1. Add DBTools Gradle Plugin and dbtools-android dependency to build.gradle file

    buildscript { repositories { mavenCentral() } dependencies { classpath 'org.dbtools:gradle-dbtools-plugin:' } }

    apply plugin: 'dbtools'

    dependencies { compile 'org.dbtools:dbtools-android:'

       // optional dependencies
       compile 'com.google.code.findbugs:jsr305:3.0.1'
       androidTestCompile 'com.google.code.findbugs:jsr305:3.0.1' // fix conflicting issue with jsr305 annotations (espresso-core)


    dbtools { type 'ANDROID' // or 'ANDROID-KOTLIN'

       basePackageName 'org.company.project.domain'
       outputSrcDir 'src/main/java/org/company/project/domain'
       // optional items
       injectionSupport false // support for @Inject (using Dagger, Guice, JEE, etc)
       jsr305Support true // support for @Notnull / @Nullable etc
       includeDatabaseNameInPackage true // place each set of domain objects into a package named after its database
       dateType 'DATE' // DATE, JSR-310, JODA
       rxJavaSupport false // support RxJava


  2. For new projects, create initial schema.xml files (Default: new files will be created in src/main/database)

    ./gradlew dbtools-init

    ... or ...

    ./gradle app:dbtools-init

    ... or ...

    From Android Studio: DOUBLE-CLICK on "dbtools-init" task from the "Gradle" Tools Window

  3. Define your database: Add schema.xml file (after executing the "dbtools-init" task (from above) an XSD definition file will be created (this may help writing the XML file in some IDE's)), to the /src/main/database directory. This file contains a list of all of the databases and tables in each database. The following is a sample of this file:

           <table name="INDIVIDUAL">
               <field name="_id" jdbcDataType="BIGINT" increment="true" primaryKey="true" notNull="true"/>
               <field name="INDIVIDUAL_TYPE_ID" jdbcDataType="INTEGER" varName="individualType" foreignKeyTable="INDIVIDUAL_TYPE" foreignKeyField="_id" foreignKeyType="ENUM" enumerationDefault="HEAD"/>
               <field name="NAME" jdbcDataType="VARCHAR" size="255" notNull="true"/>
               <field name="BIRTH_DATE" jdbcDataType="TIMESTAMP"/>
               <field name="PHONE" jdbcDataType="VARCHAR" size="255"/>
               <field name="EMAIL" jdbcDataType="VARCHAR" size="255"/>
  4. Use DBTools Generator to generate DatabaseManager and all domain classes. Execute gradle task:

    ./gradlew dbtools-genclasses

    ... or ...

    ./gradle app:dbtools-genclasses

    ... or ...

    From Android Studio: DOUBLE-CLICK on "dbtools-genclasses" task from the "Gradle" Tools Window

DBTools Generator will create the following files to manage all database connections and create/update database tables:

   DatabaseManager.java (extends DatabaseBaseManager and is used for developer customizations.  Contains CONST versions of the databases) (NEVER overwritten by generator)
   DatabaseBaseManager.java (contains boiler-plate code creating all tables and views for all databases defined in the schema.xml) (this file is ALWAYS overwritten by generator)
   DatabaseManagerConst.java (contains constant values of the database names) (this file is ALWAYS overwritten by generator)
   AppDatabaseConfig.java (DatabaseManager configuration) (NEVER overwritten by generator)

DBTools Generator will create the following files for each table (example for the Individual table):

           Individual.java (extends IndividualBaseRecord and is used for developer customizations) (NEVER overwritten by generator)
           IndividualConst.java (static fields/methods for table and columns) (this file is ALWAYS overwritten by generator)
           IndividualBaseRecord.java (contains boiler-plate code for doing CRUD operations and contains CONST names of the table and all columns (used to help writing queries)) (this file is ALWAYS overwritten by generator)

           IndividualManager.java (extends IndividualBaseManager and is used for developer customizations (such as adding new findByXXX(...) methods) (NEVER overwritten by generator)
           IndividualBaseManager.java (contains boiler-plate code for doing CRUD operations) (this file is ALWAYS overwritten by generator)
  1. Use DBTools

    IndividualManager individualManager = MainDatabaseManagers.getIndividualManager();

    Individual individual1 = new Individual(); individual1.setFirstName("Bob"); individual1.setPhone("555-555-1234");



DBTools-Android Javadoc: http://jeffdcamp.github.io/dbtools-android/javadoc/

Proguard Rules

# DBTools
-dontwarn org.dbtools.query.**
-dontwarn org.sqlite.**
-dontwarn net.sqlcipher.**
-dontwarn com.squareup.otto.**

# SQLCipher (if using SQLCipher)
-keep public class net.sqlcipher.** { *; }
-keep public class net.sqlcipher.database.** { *; }

# SQLite.org (if using sqlite from sqlite.org)
-keep public class org.sqlite.** { *; }
-keep public class org.sqlite.database.** { *; }

# Threetenbp
-dontwarn org.threeten.**


Migration guide (https://github.com/jeffdcamp/dbtools-android/blob/master/MIGRATION.md)

Other Projects

DBTools Query - https://github.com/jeffdcamp/dbtools-query


Copyright 2014 Jeff Campbell

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at


Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
See the License for the specific language governing permissions and
limitations under the License.

Watch and learn from our free Android videos