Предполагая, что Room использует Sqlite фреймворка в качестве базовой базы данных, операторы могут быть довольно просто зарегистрированы. Единственное ограничение: это можно сделать только на эмуляторе.
Из :
/**
* Controls the printing of SQL statements as they are executed.
*
* Enable using "adb shell setprop log.tag.SQLiteStatements VERBOSE".
*/
public static final boolean DEBUG_SQL_STATEMENTS =
Log.isLoggable("SQLiteStatements", Log.VERBOSE);
По умолчанию значение log.tag.SQLiteStatements
не установлено:
alex @ mbpro: ~ $ adb shell getprop log.tag.SQLiteStatements
‹- ПУСТОТА СТРОКА -›
Согласно приведенной выше документации, чтобы установить свойство, мы должны использовать:
alex @ mbpro: ~ $ adb shell setprop log.tag.SQLiteStatements VERBOSE
alex @ mbpro: ~ $ adb shell getprop log.tag.SQLiteStatements
ГЛАГОЛЬНАЯ
Как видим, значение VERBOSE
было успешно установлено. Однако, если мы повторно запустим наше приложение - мы не увидим напечатанных операторов. Чтобы он заработал, нам придется перезапустить все службы, используя adb shell stop
, а затем adb shell start
.
Если вы Попробую сделать это на обычном устройстве, вы получите следующую ошибку (пробовал с Pixel XL / стоковым Android 9):
alex @ mbpro: ~ $ adb shell start
start: должен быть root
alex @ mbpro: ~ $ adb root
adbd не может запускать как root в производственных сборках
Вот почему мы должны использовать эмулятор:
alex @ mbpro: ~ $ adb root
перезапуск adbd как root
alex @ mbpro: ~ $ adb shell stop
alex @ mbpro : ~ $ запуск оболочки adb
Эмулятор перезапустится.
Запустите приложение, и вы увидите аналогичные операторы Sqlite в logcat:
<redacted..>
V/SQLiteStatements: <redacted>/my_db: "BEGIN EXCLUSIVE;"
V/SQLiteStatements: <redacted>/my_db: "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)"
V/SQLiteStatements: <redacted>/my_db: "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, "3cb5664b6da264c13388292d98141843")"
V/SQLiteStatements: <redacted>/my_db: "CREATE TABLE IF NOT EXISTS `MyTable` (`id` TEXT NOT NULL, `date` INTEGER, `language` TEXT, PRIMARY KEY(`id`))"
<redacted..>
V/SQLiteStatements: <redacted>/my_db: "BEGIN EXCLUSIVE;"
V/SQLiteStatements: <redacted>/my_db: "PRAGMA temp_store = MEMORY;"
V/SQLiteStatements: <redacted>/my_db: "PRAGMA recursive_triggers='ON';"
V/SQLiteStatements: <redacted>/my_db: "CREATE TEMP TABLE room_table_modification_log(version INTEGER PRIMARY KEY AUTOINCREMENT, table_id INTEGER)"
V/SQLiteStatements: <redacted>/my_db: "COMMIT;"
<redacted..>
V/SQLiteStatements: <redacted>/my_db: "SELECT * FROM MyTable"
V/SQLiteStatements: <redacted>/my_db: "SELECT * FROM MyTable WHERE date = 1551562171387 AND language = 'en'"
Чтобы отменить изменения, используйте эти команды:
alex @ mbpro: ~ $ adb shell setprop log.tag.SQLiteStatements
alex @ mbpro: ~ $ adb shell getprop log.tag.SQLiteStatements
‹- ПУСТОЙ СТРОК -›
alex @ mbpro: ~ $ adb shell stop
alex @ mbpro: ~ $ adb shell start
alex @ mbpro: ~ $ adb unroot
перезапуск adbd как не root
person
Alex Lipov
schedule
02.03.2019