From dd4eb66dcf9863edd26810a5149e781e8a23858e Mon Sep 17 00:00:00 2001 From: Florent Champigny Date: Wed, 19 Nov 2025 00:22:25 +0100 Subject: [PATCH] feat: [DATABASE] inmemory --- FloconAndroid/flocon/build.gradle.kts | 3 ++ .../database/FloconDatabasePlugin.android.kt | 31 ++++++++++++++----- FloconAndroid/gradle/libs.versions.toml | 2 ++ .../database/InitializeDatabases.kt | 3 ++ 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/FloconAndroid/flocon/build.gradle.kts b/FloconAndroid/flocon/build.gradle.kts index 1a722c24..78747e4e 100644 --- a/FloconAndroid/flocon/build.gradle.kts +++ b/FloconAndroid/flocon/build.gradle.kts @@ -35,6 +35,9 @@ kotlin { implementation(libs.kotlinx.coroutines.android) implementation(libs.jakewharton.process.phoenix) implementation("com.squareup.okhttp3:okhttp:4.12.0") + + implementation("androidx.sqlite:sqlite:2.6.1") + implementation("androidx.sqlite:sqlite-framework:2.6.1") } } diff --git a/FloconAndroid/flocon/src/androidMain/kotlin/io/github/openflocon/flocon/plugins/database/FloconDatabasePlugin.android.kt b/FloconAndroid/flocon/src/androidMain/kotlin/io/github/openflocon/flocon/plugins/database/FloconDatabasePlugin.android.kt index d9737083..a30ed150 100644 --- a/FloconAndroid/flocon/src/androidMain/kotlin/io/github/openflocon/flocon/plugins/database/FloconDatabasePlugin.android.kt +++ b/FloconAndroid/flocon/src/androidMain/kotlin/io/github/openflocon/flocon/plugins/database/FloconDatabasePlugin.android.kt @@ -3,6 +3,10 @@ package io.github.openflocon.flocon.plugins.database import android.content.Context import android.database.Cursor import android.database.sqlite.SQLiteDatabase +import androidx.sqlite.db.SupportSQLiteCompat +import androidx.sqlite.db.SupportSQLiteDatabase +import androidx.sqlite.db.SupportSQLiteOpenHelper +import androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory import io.github.openflocon.flocon.FloconContext import io.github.openflocon.flocon.plugins.database.model.FloconDatabaseModel import io.github.openflocon.flocon.plugins.database.model.fromdevice.DatabaseExecuteSqlResponse @@ -23,11 +27,22 @@ internal class FloconDatabaseDataSourceAndroid(private val context: Context) : F databaseName: String, query: String ): DatabaseExecuteSqlResponse { - var database: SQLiteDatabase? = null + var database: SupportSQLiteDatabase? = null return try { val path = context.getDatabasePath(databaseName) - database = - SQLiteDatabase.openDatabase(path.absolutePath, null, SQLiteDatabase.OPEN_READWRITE) + val helper = FrameworkSQLiteOpenHelperFactory().create(SupportSQLiteOpenHelper.Configuration.builder(context) + .name(path.absolutePath) + .callback(object : SupportSQLiteOpenHelper.Callback(1) { + override fun onCreate(db: SupportSQLiteDatabase) { + // Rien + } + override fun onUpgrade(db: SupportSQLiteDatabase, oldVersion: Int, newVersion: Int) { + // Rien + } + }) + .build()) + database = helper.writableDatabase + val firstWordUpperCase = getFirstWord(query).uppercase(Locale.getDefault()) when (firstWordUpperCase) { "UPDATE", "DELETE" -> executeUpdateDelete(database, query) @@ -115,10 +130,10 @@ internal class FloconDatabaseDataSourceAndroid(private val context: Context) : F private fun executeSelect( - database: SQLiteDatabase, + database: SupportSQLiteDatabase, query: String, ): DatabaseExecuteSqlResponse { - val cursor: Cursor = database.rawQuery(query, null) + val cursor: Cursor = database.query(query) try { val columnNames = cursor.columnNames.toList() val rows = cursorToList(cursor) @@ -132,7 +147,7 @@ private fun executeSelect( } private fun executeUpdateDelete( - database: SQLiteDatabase, + database: SupportSQLiteDatabase, query: String, ): DatabaseExecuteSqlResponse { val statement = database.compileStatement(query) @@ -141,7 +156,7 @@ private fun executeUpdateDelete( } private fun executeInsert( - database: SQLiteDatabase, + database: SupportSQLiteDatabase, query: String, ): DatabaseExecuteSqlResponse { val statement = database.compileStatement(query) @@ -150,7 +165,7 @@ private fun executeInsert( } private fun executeRawQuery( - database: SQLiteDatabase, + database: SupportSQLiteDatabase, query: String, ): DatabaseExecuteSqlResponse { database.execSQL(query) diff --git a/FloconAndroid/gradle/libs.versions.toml b/FloconAndroid/gradle/libs.versions.toml index 1e4a3182..68f93d37 100644 --- a/FloconAndroid/gradle/libs.versions.toml +++ b/FloconAndroid/gradle/libs.versions.toml @@ -31,6 +31,7 @@ processPhoenix = "3.0.0" sqlite = "2.5.2" sqliteJdbc = "3.50.3.0" buildconfig = "5.6.8" +sqliteKtx = "2.6.1" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -89,6 +90,7 @@ protobuf-util = { group = "com.google.protobuf", name = "protobuf-java-util", ve sqlite-jdbc = { module = "org.xerial:sqlite-jdbc", version.ref = "sqliteJdbc" } squareup-okhttp = { module = "com.squareup.okhttp3:okhttp" } sqlite-bundled = { module = "androidx.sqlite:sqlite-bundled", version.ref = "sqlite" } +androidx-sqlite-ktx = { group = "androidx.sqlite", name = "sqlite-ktx", version.ref = "sqliteKtx" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } diff --git a/FloconAndroid/sample-android-only/src/main/java/io/github/openflocon/flocon/myapplication/database/InitializeDatabases.kt b/FloconAndroid/sample-android-only/src/main/java/io/github/openflocon/flocon/myapplication/database/InitializeDatabases.kt index 58eb0f2f..3546b805 100644 --- a/FloconAndroid/sample-android-only/src/main/java/io/github/openflocon/flocon/myapplication/database/InitializeDatabases.kt +++ b/FloconAndroid/sample-android-only/src/main/java/io/github/openflocon/flocon/myapplication/database/InitializeDatabases.kt @@ -1,6 +1,7 @@ package io.github.openflocon.flocon.myapplication.database import android.content.Context +import androidx.room.Room import io.github.openflocon.flocon.myapplication.database.model.DogEntity import io.github.openflocon.flocon.myapplication.database.model.FoodEntity import io.github.openflocon.flocon.myapplication.database.model.HumanEntity @@ -12,6 +13,8 @@ fun initializeDatabases(context: Context) { val dogDatabase = DogDatabase.getDatabase(context) val foodDatabase = FoodDatabase.getDatabase(context) + val x: DogDatabase = Room.inMemoryDatabaseBuilder(context, DogDatabase::class.java).build() + GlobalScope.launch { dogDatabase.dogDao().insertDog( DogEntity(