I was able to achieve this using the Select query hack. This will not work for insert / update / delete operations :)
Create a separate RoomLoggingHelper class as follows
import android.annotation.SuppressLint import androidx.room.RoomSQLiteQuery private const val NULL = 1 private const val LONG = 2 private const val DOUBLE = 3 private const val STRING = 4 private const val BLOB = 5 private const val NULL_QUERY = "NULL" const val ROOM_LOGGING_TAG = "roomQueryLog" object RoomLoggingHelper { @SuppressLint("RestrictedApi") fun getStringSql(query: RoomSQLiteQuery): String { val argList = arrayListOf<String>() val bindingTypes = query.getBindingTypes() var i = 0 while (i < bindingTypes.size) { val bindingType = bindingTypes[i] when (bindingType) { NULL -> argList.add(NULL_QUERY) LONG -> argList.add(query.getLongBindings()[i].toString()) DOUBLE -> argList.add(query.getDoubleBindings()[i].toString()) STRING -> argList.add(query.getStringBindings()[i].toString()) } i++ } return String.format(query.sql.replace("?", "%s"), *argList.toArray()) } fun getStringSql(query: String?, args: Array<out Any>?): String? { return if (query != null && args != null) { String.format(query.replace("?", "%s"), *args) } else "" } } private fun RoomSQLiteQuery.getBindingTypes(): IntArray { return javaClass.getDeclaredField("mBindingTypes").let { field -> field.isAccessible = true return@let field.get(this) as IntArray } } private fun RoomSQLiteQuery.getLongBindings(): LongArray { return javaClass.getDeclaredField("mLongBindings").let { field -> field.isAccessible = true return@let field.get(this) as LongArray } } private fun RoomSQLiteQuery.getStringBindings(): Array<String> { return javaClass.getDeclaredField("mStringBindings").let { field -> field.isAccessible = true return@let field.get(this) as Array<String> } } private fun RoomSQLiteQuery.getDoubleBindings(): DoubleArray { return javaClass.getDeclaredField("mDoubleBindings").let { field -> field.isAccessible = true return@let field.get(this) as DoubleArray } } private fun RoomSQLiteQuery.getIntBindings(): IntArray { return javaClass.getDeclaredField("mBindingTypes").let { field -> field.isAccessible = true return@let field.get(this) as IntArray } }
Or you can download this file here.
Add this file to your project and call it from the Room Database class as follows: override both query methods as follows
override fun query(query: SupportSQLiteQuery?): Cursor {
Denial of responsibility:
- I use Reflection to get string SQL, therefore, use this ONLY in debug mode
- This is written in haste and may contain errors, it would be advisable to save it in a
try-catch - Also, I checked it for string arguments, should work long and double, will not work for
Blobs
source share