房间持久性库 - 创建视图

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();