9

Im investigating Android Room databases in my current application.

I am trying to install the most recent version of Sqlite by employing the most recent aar

I have tried placing the aar in my database module libs folder and referencing that in my gradle file however the sqlite version displayed is always 3.22.0 where the aar is 3.34.0

what are the steps I need to follow to override the version of Sqlite supplied by default and use my downloaded aar file?

or

Is this not possible?

The sqlite.org website has this

There are three ways to add the SQLite Android bindings to an application:

By adding a pre-built aar file to the applications Android Studio project. By building an aar file, then adding it to the applications Android Studio project as in (1). By adding the SQLite Android bindings source code to and building it along with the other application code. By default, the SQLite Android bindings support Android API levels 16 and greater (Android versions 4.1 and up). There is also a separate version that supports Android API levels 9 and greater (Android version 2.3 and up). Please note the extra step involved in obtaining the code if you wish to use the version compatible with API level 9.

  1. Using a Pre-Built aar File This is the most straightforward option. An "aar" file is similar to a jar file, except that it may contain both compiled java classes and native code. An aar file for the latest SQLite release usable with API levels 16 and up is available from this page.

There are two steps involved in adding an aar file to an Android Studio project:

Import the module. In Android Studio 2.1 this is accomplished by selecting the "File" -> "New" -> "New Module..." menu and then choosing "Import JAR/AAR Package". Add a dependency on the new module to the main application module (or to all modules that will use the SQLite Android bindings). In Android Studio 2.1 the dependency may be created using the project structure dialog (select "File" -> "Project Structure...") or by adding code similar to the following to the application modules build.gradle file: dependencies { // Change "sqlite-android-3130000" to the name of the new module! compile project(':sqlite-android-3130000') }

I've tried this approach and room still reports the original version. I believe there is an approach that will replace the bundled sqlite that is provided by Android as default

Hector
  • 4,016
  • 21
  • 112
  • 211

3 Answers3

13

To use a different database implementation with Room, you need to find (or create) a SupportSQLiteOpenHelper.Factory implementation and supply it to your RoomDatabase.Builder via openHelperFactory():

val builder = Room.databaseBuilder(context, SomeDatabase.class, DB_NAME)
  .openHelperFactory(factory)
  .build()

The simplest way to do that is to use Requery's standalone SQLite library. You would use RequerySQLiteOpenHelperFactory as the implementation of the SupportSQLiteOpenHelper.Factory, and it will use Requery's packaged copy of SQLite instead of the framework one.

If, for some reason, you do not wish to use Requery's library, you would need to find an equivalent that you like, or you would need to implement the SupportSQLite* APIs yourself. I did that twice for SQLCipher for Android, and it is a pain, but it certainly is doable.

CommonsWare
  • 986,068
  • 189
  • 2,389
  • 2,491
  • this does work, however using implementation 'io.requery:sqlite-android:3.33.0' seems to stop Android Studio database browser being able to access my devices DB – Hector Dec 12 '20 at 19:37
2

SQLite comes bundled with the Android SDK, that means that SQLite version is changing with the increasing of the API level. Phone manufacturers can choose to ship different sqlite version with their device system.

Final verdict, you can't change it, unless running on rooted device.

Edit: Guide suggests using different sqlite version to by-pass the built-in, that would require usage of different wrapper around the new sqlite which will not communicate with the system one. This prevents you from using android database packages, including Room.

Nikola Despotoski
  • 49,966
  • 15
  • 119
  • 148
  • I believe it is possible to override the package sqlite version on Android. as detailed here on the sqlite.org website... https://sqlite.org/android/doc/trunk/www/index.wiki. I have managed to achieve this in the past, however that was with basic Sqlite not with Room. I am certain it is possible to employ a different version of sqlite than that package with android – Hector Dec 12 '20 at 15:16
  • The guide you references says that you need to by pass the built-in sqlite, which means you shouldn't use the sdk API, but another wrapper, around SQLite. In any other case it explicitly says that you can't divorce the version. – Nikola Despotoski Dec 12 '20 at 15:21
0

When investigating technology for data persistence in your android project, JPA for android should be considered. JPA is java standard, and JPA code can be re-used on java server side or other java client. see Cmobilecom-JPA for android.

eastwater
  • 4,624
  • 9
  • 49
  • 118