给定如下所示的房间数据库DAO:
import android.arch.persistence.room.Dao;
import android.arch.persistence.room.Query;
import java.util.Date;
import java.util.List;
@Dao
public interface MyDao {
@Query("SELECT * FROM MyTable")
List<MyItem> all();
@Query("SELECT * FROM MyTable WHERE date = :date AND language = :language")
MyItem byDate(Date date, String language);
}
是否有一种方法可以在mydao
中添加一个记录器或类似的东西,这样我就可以看到哪些语句正在执行。这在开发过程中非常有用,因为我可以立即检查函数是否正确地转换为预期的SQL语句。
假设Room使用Framework的Sqlite作为底层数据库,则可以非常简单地记录语句。唯一的限制:这只能在模拟器上完成。
从sqlitedebug.java:
/**
* 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 root
以root身份重新启动adbd
Alex@mbpro:~$adb shell stop
Alex@mbpro:~$adb shell start
模拟器将重新启动。
运行应用程序,您将在logcat中看到类似的Sqlite语句:
<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 shell start
Alex@mbpro:~$adb unroot
以非root身份重新启动adbd
错误:查询有问题:[SQLITE_ERROR]SQL错误或缺少数据库(没有这样的表:任务) 显示了这个错误,我怎么可能修复它? 我正在学习这个教程
我正在迁移一个运行在Android上的现有应用程序,并正在将其迁移到Raspberry Pi。只是想知道是否有可能直接迁移Room数据库的使用。
并且我发现了基于数据库版本4的可能场景的迁移varargs。 我的问题是,假设我使用的是db v1的Room,当我的应用程序到达db v10时,我将不得不编写多少迁移方法? 在sqlite中,我们在中获得已安装应用程序的当前db版本,我们只需通过开关大小写而不使用break语句,以便满足所有db升级。
我是新来的和我试图我的得到一个从它。我试图这样做的它与这是id但问题是我不知道如何返回目标从。 这就是<代码>刀 这是Repository类
我有一个现有的Android项目,在其中我创建了一个新的(offlineservicelibrary)(文件/new/new module/Android library)。在这个库中,我想创建一个房间数据库。 我遵循https://developer.android.com/training/data-storage/room并为我的数据库创建了Entity(OfflineData)和DAO(O
当我试图构建我的应用程序时,我遇到了以下编译错误: 持久性模块在Android设置中是独立的。 建筑格拉德尔 ext.androidXRoom=“2.1.0-alpha02” 我试着把kotlin版本,room版本,改回AndroidArch room,但没用。我还尝试了清理项目和使Android Studio的缓存失效。但它不起作用。 编辑:AppDatabase源