我需要在使用Room Persistence Library的查询中使用SQL VIEW.
在这里使用Commonsware的答案我已经能够运行原始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();
Run Code Online (Sandbox Code Playgroud)
VIEW实际上是在SQLite数据库上创建的并且工作正常,但我不能在我的Dao的@Query中引用它,因为我得到一个编译时错误:
错误:(100,48)错误:查询有问题:[SQLITE_ERROR] SQL错误或缺少数据库(没有这样的表:view_name)
有关如何让Room了解我的观点或忽略错误的任何想法?
更新17/12/2018
Room persistence库的2.1.0及更高版本现在支持SQLite数据库视图:https: //developer.android.com/training/data-storage/room/creating-views (参见DD的评论)
更新15/12/2017
请注意,此解决方案实际上会破坏数据库迁移.
问题在于视图中显然不存在的Entity主键,因此迁移无效.
请参阅CommonsWare对可能的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();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1733 次 |
| 最近记录: |