我需要在使用Room Persistence Library的查询中使用SQL VIEW。
使用Commonsware的答案here我已经能够在数据库创建期间运行原始SQL语句来创建视图。
Room.databaseBuilder(context, MyDatabase.class, DB_NAME)
.addCallback(new RoomDatabase.Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
db.execSQL("CREATE VIEW view_name " +
"AS SELECT [...] "
);
}
})
.build();
VIEW实际上是在SQLite DB上创建的并且工作正常,但是我不能在我的Dao的@Query中引用它,因为我得到了一个编译时错误:
错误:(100,48)错误:查询出现问题:[SQLITE_ERROR] SQL错误或缺少数据库(没有这样的表:view_name)
有关如何让Room了解我的观点或忽略错误的想法吗?
答案 0 :(得分:6)
更新17/12/2018
Room Persistence库的2.1.0及更高版本现在提供对SQLite数据库视图的支持: https://developer.android.com/training/data-storage/room/creating-views (见D-D的评论)
更新15/12/2017
请注意,此解决方案实际上会破坏数据库迁移。
问题在于Entity主键在视图中显然不存在,因此迁移无效。
请参阅CommonsWare's comment了解可能的hacky解决方法。
原始回答
目前使用Room似乎无法做到这一点。
无论如何,我已经使用解决方法完成了它:我创建了一个与视图具有相同名称和列的实体(只有名称实际上是必需的),这将在DB上创建一个表并允许您可以在没有编译时错误的查询中使用该表名。
然后在Room DB创建期间,我在CREATE VIEW之前删除此实体的表。
Room
.databaseBuilder(context, DueDatabase.class, DB_NAME)
.addCallback(new RoomDatabase.Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
//Drop the fake table and create a view with the same name
db.execSQL("DROP TABLE view_name");
db.execSQL("CREATE VIEW view_name " +
"AS SELECT [...]"
);
}
})
.build();