房间持久性库 - 创建视图
Room Persistence Library - CREATE VIEW
我需要在使用 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 数据库上创建的并且工作正常,但我无法在我的 Dao 的 @Query 中引用它,因为我遇到编译时错误:
Error:(100, 48) error: There is a problem with the query: [SQLITE_ERROR] SQL error or missing database (no such table: view_name)
关于如何让 Room 知道我的观点或忽略错误有什么想法吗?
2018 年 12 月 17 日更新
2.1.0 版及更高版本的 Room 持久性库现在支持 SQLite 数据库视图:
https://developer.android.com/training/data-storage/room/creating-views
(见D-D的评论)
2017 年 12 月 15 日更新
请注意,此解决方案实际上会破坏数据库迁移。
问题出在视图中显然不存在的实体主键,因此迁移无效。
有关可能的 hacky 解决方法,请参阅 。
原始答案
目前使用 Room 似乎无法做到这一点。
无论如何,我已经使用解决方法完成了它:我创建了一个与视图具有相同名称和列的实体(实际上只有名称是必需的),这将在数据库上创建一个 table并允许您在查询中使用该 table 名称而不会出现编译时错误。
然后在创建 Room DB 期间,我在 CREATE VIEW 之前删除了这个实体的 table。
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();
我需要在使用 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 数据库上创建的并且工作正常,但我无法在我的 Dao 的 @Query 中引用它,因为我遇到编译时错误:
Error:(100, 48) error: There is a problem with the query: [SQLITE_ERROR] SQL error or missing database (no such table: view_name)
关于如何让 Room 知道我的观点或忽略错误有什么想法吗?
2018 年 12 月 17 日更新
2.1.0 版及更高版本的 Room 持久性库现在支持 SQLite 数据库视图: https://developer.android.com/training/data-storage/room/creating-views (见D-D的评论)
2017 年 12 月 15 日更新
请注意,此解决方案实际上会破坏数据库迁移。
问题出在视图中显然不存在的实体主键,因此迁移无效。
有关可能的 hacky 解决方法,请参阅
原始答案
目前使用 Room 似乎无法做到这一点。
无论如何,我已经使用解决方法完成了它:我创建了一个与视图具有相同名称和列的实体(实际上只有名称是必需的),这将在数据库上创建一个 table并允许您在查询中使用该 table 名称而不会出现编译时错误。
然后在创建 Room DB 期间,我在 CREATE VIEW 之前删除了这个实体的 table。
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();