Room持久化库 - CREATE VIEW

5

我需要在使用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();

这个VIEW实际上是在SQLite数据库上创建的,并且运行良好,但是我无法在我的Dao的@Query中引用它,因为我会得到一个编译时错误:

错误:(100,48)错误:查询存在问题:[SQLITE_ERROR] SQL错误或缺少数据库(没有这样的表:view_name)

有什么想法让Room知道我的视图或忽略此错误吗?

1个回答

6

更新于2018年12月17日

从2.1.0版本开始,Room持久性库现在支持SQLite数据库视图: https://developer.android.com/training/data-storage/room/creating-views (请参见D-D的评论)

更新于2017年12月15日

请注意,这种解决方案实际上会破坏数据库迁移。

问题在于实体主键显然不存在于视图中,因此迁移无效。

有可能通过一个hacky的解决方法,请参考CommonsWare's comment

原始答案

目前似乎使用Room不能直接创建视图。

不过,我使用了一个解决方法:我创建了一个名称和视图相同的实体,并具有相同的列(只有名称是必需的),这将在数据库上创建一个表,并允许您在查询中使用该表名,而不会出现编译时错误。

然后,在Room数据库创建期间,在CREATE VIEW之前DROP掉这个实体的表。

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

好的解决方法!我没有看到已经为此提交的问题,所以我添加了一个 - CommonsWare
@CommonsWare,请查看我的答案更新,似乎我的解决方案使得迁移变得不可能。您有什么建议吗? - Francesco
是的,我并不惊讶你遇到了问题,尽管我有一些希望你的解决方法能够坚持下去。我唯一能想到的就是让你的迁移删除视图并创建适当的实体表,再在某个地方做个笔记,在迁移运行后触发你还原它(例如,在 RoomDatabase.CallbackonOpen() 方法中)。即使这样能行,也只是对你现有解决方案的另一种修改,这开始让人感到可怕了 :-( - CommonsWare
是的,我理解你提出的建议,之前我也尝试过类似的东西,但最终放弃了。 现在这个方法变得非常hacky,我更倾向于在Room获得适当支持之前摆脱DB视图。 一如既往,感谢CommonsGuy。 - Francesco
1
https://developer.android.com/training/data-storage/room/creating-views - D-D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接